Подтвердить что ты не робот

Как выполнить объединение по нескольким критериям, возвращая все комбинации обоих критериев

Я готов поспорить, что это очень простой ответ, поскольку я - noob для SQL.

Таблица 1 имеет столбец 1 (критерий 1) столбец 2 (критерии 2) столбец 3 (метрика 1)

Таблица 2 содержит столбец 1 (критерии 1) столбец 2 (критерии 2) столбец 3 (метрика 2, характерная для таблицы2.criteria2)

Для каждого критерия 1 в таблице может быть от 1 до 5 значений критериев 2.

когда я использую здесь операцию соединения (предполагая, что я идентифицирую таблицу 1 как один до этого):

Select WeddingTable, TableSeat, TableSeatID, Name, Two.Meal
FROM table1 as One
inner join table2 as Two
on One.WeddingTable = Two.WeddingTable and One.TableSeat = Two.TableSeat

Я получаю только один из критериев 1/критерии 2, даже если знаю, что есть 3 или 4. Как мне получить все комбинации?

Возьмите ситуацию, когда есть свадьба, где таблица 1 в основном представляет собой сидения, а таблица 2 - это вариант еды, который выбрал каждый стол/сиденье. Таблица 1 имеет удобный TableSeatID, но таблица 2 не имеет сопоставимого идентификатора.

Примеры данных

enter image description here

Результаты должны показать все 4 линии, все 3 места в WeddingTable 001 и одно место в WeddingTable 002.

Желаемые результаты:

enter image description here

4b9b3361

Ответ 1

select one.*, two.meal
from table1 as one
left join table2 as two
on (one.weddingtable = two.weddingtable and one.tableseat = two.tableseat)

Ответ 2

SELECT  aa.*,
        bb.meal
FROM    table1 aa
        INNER JOIN table2 bb
            ON aa.tableseat = bb.tableseat AND
                aa.weddingtable = bb.weddingtable
        INNER JOIN
        (
            SELECT  a.tableSeat
            FROM    table1 a
                    INNER JOIN table2 b
                        ON a.tableseat = b.tableseat AND
                            a.weddingtable = b.weddingtable
            WHERE b.meal IN ('chicken', 'steak')
            GROUP by a.tableSeat
            HAVING COUNT(DISTINCT b.Meal) = 2
        ) c ON aa.tableseat = c.tableSeat

Ответ 3

create table a1
(weddingTable INT(3),
 tableSeat INT(3),
 tableSeatID INT(6),
 Name varchar(10));

insert into a1
 (weddingTable, tableSeat, tableSeatID, Name)
 values (001,001,001001,'Bob'),
 (001,002,001002,'Joe'),
 (001,003,001003,'Dan'),
 (002,001,002001,'Mark');

create table a2
 (weddingTable int(3),
 tableSeat int(3),
 Meal varchar(10));

insert into a2
(weddingTable, tableSeat, Meal)
values 
(001,001,'Chicken'),
(001,002,'Steak'),
(001,003,'Salmon'),
(002,001,'Steak');

select x.*, y.Meal

from a1 as x
JOIN a2 as y ON (x.weddingTable = y.weddingTable) AND (x.tableSeat = y. tableSeat);

Ответ 4

Похоже, вы хотите перечислить все показатели?

SELECT Criteria1, Criteria2, Metric1 As Metric
FROM Table1
UNION ALL
SELECT Criteria1, Criteria2, Metric2 As Metric
FROM Table2
ORDER BY 1, 2

Если вам нужна только одна комбинация Criteria1 + Criteria2, сгруппируйте их:

SELECT Criteria1, Criteia2, SUM(Metric) AS Metric
FROM (
    SELECT Criteria1, Criteria2, Metric1 As Metric
    FROM Table1
    UNION ALL
    SELECT Criteria1, Criteria2, Metric2 As Metric
    FROM Table2
)
ORDER BY Criteria1, Criteria2