繁体   English   中英

SQL外部联接具有引用同一张表的多个外键

[英]SQL outer join with multiple foreign keys referencing the same table

我有一张桌子

P1   P2   P3   P4   P5
ID   ID   NULL ID   NULL
...

和一张桌子

ID   Name
ID   xyz
...

并希望选择此节目,例如:

P1   P2   P3   P4   P5
Name Name Name Name Name
...

我尝试了Join(一个和多个),Select和Multiple FROM,但是每次我都具有ID或5列的所有5列时,每列都包含每个名称。

现在,我正在考虑创建一个新表,并将每个列都放在其中,但是我认为并希望有另一种方法。

编辑:我的代码:

    SELECT 
    TodayPaddock.Paddock1, 
    TodayPaddock.Paddock2
FROM 
    TodayPaddock
Left OUTER JOIN 
Pferde ON Pferde.Id = TodayPaddock.Paddock1  
AND Pferde.Id = TodayPaddock.Paddock2

您需要多个join 实际上是left join s:

select t2_1.name, t2_2.name, t2_3.name, t2_4.name, t2_5.name
from table1 t1 left join
     table2 t2_1
     on t1.p1 = t2_1.id left join
     table2 t2_2
     on t1.p2 = t2_2.id left join
     table2 t2_3
     on t1.p3 = t2_3.id left join
     table2 t2_4
     on t1.p4 = t2_4.id left join
     table2 t2_5
     on t1.p5 = t2_5.id;

有一个单一外部联接的方法。 当然,您将需要检查查询计划,以确保它比调整索引后并具有足够数据量的5个联接的查询计划更好。 此解决方案假定P1,P2,P3,P4,P5是TodayPaddock表的唯一键。 如果不是,您将需要添加一个唯一列进行分组,即使它只是一个自动增量列。

CREATE TABLE Pferde (
    ID INT NOT NULL PRIMARY KEY,
    Name VARCHAR(50) NOT NULL
)

INSERT Pferde (ID, Name) VALUES (1, 'NAME1')
INSERT Pferde (ID, Name) VALUES (2, 'NAME2')
INSERT Pferde (ID, Name) VALUES (3, 'NAME3')
INSERT Pferde (ID, Name) VALUES (4, 'NAME4')
INSERT Pferde (ID, Name) VALUES (5, 'NAME5')

CREATE TABLE TodayPaddock (
    P1 INT NULL FOREIGN KEY REFERENCES Pferde,
    P2 INT NULL FOREIGN KEY REFERENCES Pferde,
    P3 INT NULL FOREIGN KEY REFERENCES Pferde,
    P4 INT NULL FOREIGN KEY REFERENCES Pferde,
    P5 INT NULL FOREIGN KEY REFERENCES Pferde,
    UNIQUE (P1, P2, P3, P4, P5)
)

INSERT TodayPaddock (P1, P2, P3, P4, P5) VALUES (1, 2, NULL, 4, NULL)
INSERT TodayPaddock (P1, P2, P3, P4, P5) VALUES (NULL, NULL, 3, NULL, 5)

SELECT
    MAX(CASE WHEN P.ID = TP.P1 THEN P.Name END) AS P1,
    MAX(CASE WHEN P.ID = TP.P2 THEN P.Name END) AS P2,
    MAX(CASE WHEN P.ID = TP.P3 THEN P.Name END) AS P3,
    MAX(CASE WHEN P.ID = TP.P4 THEN P.Name END) AS P4,
    MAX(CASE WHEN P.ID = TP.P5 THEN P.Name END) AS P5
FROM TodayPaddock AS TP
LEFT JOIN Pferde AS P
ON P.ID IN (TP.P1, TP.P2, TP.P3, TP.P4, TP.P5)
GROUP BY TP.P1, TP.P2, TP.P3, TP.P4, TP.P5

结果:

P1      P2      P3      P4      P5
NULL    NULL    NAME3   NULL    NAME5
NAME1   NAME2   NULL    NAME4   NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM