SQL 使用多个外键引用相同的外连接 table
SQL outer join with multiple foreign keys referencing the same table
我有一个 table 和
P1 P2 P3 P4 P5
ID ID NULL ID NULL
...
和一个 table 和
ID Name
ID xyz
...
并想要一个 select 这个节目,例如这个:
P1 P2 P3 P4 P5
Name Name Name Name Name
...
我尝试使用 Join(一个和多个)、Select 和 Multiple FROM,但每次我都有 5 列 ID 或 5 列并且每列包含每个名称。
现在我正在考虑制作一个新的 table 并将每一列都放在那里,但我认为并希望有其他方法。
编辑:
我的代码:
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 table 的唯一键。如果没有,您将需要添加一个唯一列作为分组依据,即使它只是一个自动递增列。
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
我有一个 table 和
P1 P2 P3 P4 P5
ID ID NULL ID NULL
...
和一个 table 和
ID Name
ID xyz
...
并想要一个 select 这个节目,例如这个:
P1 P2 P3 P4 P5
Name Name Name Name Name
...
我尝试使用 Join(一个和多个)、Select 和 Multiple FROM,但每次我都有 5 列 ID 或 5 列并且每列包含每个名称。
现在我正在考虑制作一个新的 table 并将每一列都放在那里,但我认为并希望有其他方法。
编辑: 我的代码:
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 table 的唯一键。如果没有,您将需要添加一个唯一列作为分组依据,即使它只是一个自动递增列。
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