我有两个桌子。
表A:
Table A ID Table Name owner1ID owner2ID
1 Work1 85 91
2 Work2 86 92
3 Work3 87 93
4 Work4 88 94
5 Work5 89 95
6 Work6 90 96
表B:
OwnerID 0WNERFIRSTNAME 0WNERlASTNAME
85 A M
86 B N
87 C O
88 D P
90 E Q
91 F R
89 G S
92 H T
86 I U
94 J V
93 K W
95 L X
您能帮我得到一个需要包含TABLEID OWNERFIRSTNAME和OWNERSECONDNAME的表的查询吗?
预期输出:
TableAID 0WNER1FIRSTNAME 0WNER1LASTNAME 0WNER2FIRSTNAME 0WNER2LASTNAME
1 A M F R
答案 0 :(得分:4)
您需要加入TableB
两次 。
这意味着您需要为表的每个实例赋予一个别名,以便区分要引用的实例...
SELECT
TableA.TableAID,
TableB1.0WNERFIRSTNAME AS 0WNER1FIRSTNAME,
TableB1.0WNERlASTNAME AS 0WNER1LASTNAME,
TableB2.0WNERFIRSTNAME AS 0WNER2FIRSTNAME,
TableB2.0WNERlASTNAME AS 0WNER2LASTNAME
FROM
TableA
INNER JOIN
TableB TableB1
ON TableB1.OwnerID = TableA.owner1ID
INNER JOIN
TableB TableB2
ON TableB2.OwnerID = TableA.owner2ID
P.S。 。请勿将0WNERFIRSTNAME
拼写为零,而将其OWNERFIRSTNAME
拼写!
答案 1 :(得分:0)
虽然MatBaile的答案是最常见的做法,但您自己的示例显示了一些问题。首先,我们丢失了有关表6的信息,而在第二个表中找不到该表的第二个所有者。可以使用left join
轻松纠正:
select a.id, a.table_name,
b1.OwnerFirstName O1FN, b1.OwnerLastName O1LN,
b2.OwnerFirstName O2FN, b2.OwnerLastName O2LN
from a
left join b b1 on b1.OwnerId = a.Owner1Id
left join b b2 on b2.OwnerId = a.Owner2Id
什么给了我们
ID TABLE_NAME O1FN O1LN O2FN O2LN
---------- ---------- ---- ---- ---- ----
1 Work1 A M F R
2 Work2 I U H T <-- two first owners
2 Work2 B N H T <-- two first owners
4 Work4 D P J V
3 Work3 C O K W
5 Work5 G S L X
6 Work6 E Q <-- null second owner
第二个问题-对于表2,我们有两个条目,因为在您的示例中,两个拥有id = 86
的所有者。我怀疑这是拼写错误,但在类似情况下可能会发生。您可以保留原样,或者仅保留最后一行(如果所有者更改,并且在某个日期列中有关于此的信息),或者可以使用listagg()
列出所有所有者,或者采用最大值。当有更多行连接到1.和2.所有者时,情况会变得更糟。
出于好奇,这里是unpivot-pivot
解决方案。在这种情况下,此查询看起来更复杂,但是如果有10列,则必须进行10次连接,并且在此查询中,仅列列表需要更改。
select *
from (
select id, table_name, type, ownerfirstname, ownerlastname
from (select * from a unpivot (ownerId for type in (owner1ID as 1, owner2ID as 2))) a
join b using (ownerId))
pivot (listagg(ownerfirstname||' '||ownerlastname, ', ') within group (order by null) owner
for type in (1, 2))
ID TABLE_NAME 1_OWNER 2_OWNER
---------- ---------- ---------- ----------
1 Work1 A M F R
2 Work2 B N, I U H T <-- listagg() used to aggregate data
3 Work3 C O K W
4 Work4 D P J V
5 Work5 G S L X
6 Work6 E Q