web-dev-qa-db-fra.com

Comment faire pour rejoindre sur plusieurs critères, en retournant toutes les combinaisons des deux critères

Je suis prêt à parier que c'est une réponse très simple car je ne suis pas un novice en SQL.

le tableau 1 contient la colonne 1 (critère 1), la colonne 2 (critère 2), la colonne 3 (métrique 1)

le tableau 2 contient la colonne 1 (critère 1), la colonne 2 (critère 2), la colonne 3 (métrique 2 propre au tableau 2. critères 2)

Il peut y avoir de 1 à 5 valeurs du critère 2 pour chaque critère 1 du tableau.

quand j'utilise la déclaration de jointure ici (en supposant que j'identifie le tableau 1 comme étant un avant cela):

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

Je ne reçois qu'une des combinaisons de critères 1/critère 2 même si je sais pertinemment qu'il y en a 3 ou 4. Comment puis-je obtenir toutes les combinaisons?

Prenons le cas d’un mariage où la table 1 est essentiellement un tableau de places assises et la table 2 représente l’option de repas choisie par chaque table/siège. Le tableau 1 contient le très pratique TableSeatID, mais le tableau 2 n’a pas d’ID comparable.

Exemple de données:

enter image description here

Les résultats doivent montrer les 4 lignes, à savoir les 3 sièges de WeddingTable 001 et le siège de WeddingTable 002.

Résultats souhaités:

enter image description here

41
tarheel
select one.*, two.meal
from table1 as one
left join table2 as two
on (one.weddingtable = two.weddingtable and one.tableseat = two.tableseat)
65
Anom
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
5
John Woo
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);
1
user3499666

On dirait que vous voulez lister toutes les métriques?

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

Si vous souhaitez uniquement une combinaison Critères1 + Critères2, regroupez-les:

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
0
Chris Latta