【问题标题】:SQL outer join with multiple foreign keys referencing the same table多个外键引用同一个表的 SQL 外连接
【发布时间】:2015-04-17 01:28:06
【问题描述】:

我有一张桌子

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,但每次我都有所有 5 列的 ID 或 5 列并且每列包含每个名称。

现在我正在考虑制作一个新表并将每一列都放在其中,但我认为并希望有其他方法。

编辑: 我的代码:

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

【问题讨论】:

  • 我们可以看到您尝试的查询吗?
  • SELECT Pferde.Pferdename FROM Pferde Right JOIN TodayPaddock AS P1 ON Pferde.Id = P1.Paddock1 Right JOIN TodayPaddock AS P2 ON Pferde.Id = P2.Paddock2 and SELECT TodayPaddock.Paddock1, TodayPaddock.Paddock2 FROM TodayPaddock Right JOIN Pferde ON Pferde.Id = TodayPaddock.Paddock1 Right JOIN Pferde ON Pferde.Id = TodayPaddock.Paddock2

标签: sql outer-join jointable


【解决方案1】:

您需要多个joins。其实left joins:

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;

【讨论】:

  • 谢谢,我搜索了 3 个小时,但无法进行多次连接;-D
【解决方案2】:

有一种方法可以使用单个外连接。当然,您将需要检查查询计划,以确保它在调整索引后优于 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

【讨论】:

  • 看起来很棒^^下次会尝试这样构建它
猜你喜欢
  • 1970-01-01
  • 2019-12-23
  • 2016-01-07
  • 2016-12-23
  • 1970-01-01
  • 2020-12-24
  • 2017-01-16
  • 2023-03-17
  • 2018-03-25
相关资源
最近更新 更多