SQL在同一行中选择1到多个

我有一个包含1条记录的表,然后绑定到辅助表,该表可以包含不匹配,1匹配或2匹配.

我需要获取相应的记录并在同一行中显示它们,如果我只有1或没有匹配可以使用左连接,那么,因为我可以得到2个匹配,它产生2个记录.

1匹配的示例:

Select T1.ID, T1.Person1, T2.Owner
From T1
Left Join T2
  ON T1.ID = T2.MatchID

产量

ID   Person1  Owner1 
----------------------
1    John     Frank

2匹配示例:

Select T1.ID, T1.Person1, T2.Owner
From T1
Left Join T2
  ON T1.ID = T2.MatchID

产量

ID   Person1  Owner 
----------------------
1    John     Frank
1    John     Peter

有没有办法可以制定我的选择,以便我的输出反映以下当我有2个匹配时:

ID   Person1  Owner1   Owner2
-------------------------------
1    John     Frank     Peter

我对Oracle Pivots进行了一些探索,但无法找到一种方法来实现这一目标.还研究了在获取匹配时使用MIN()和MAX()两次在同一个表上使用左连接的可能性,但是我只能看到自己将其作为“无其他选项”场景.

有什么建议?

**编辑**

@ughai – 使用CTE确实在某种程度上解决了这个问题,但是在尝试检索所有记录时,从这个公共表派生的详细信息没有在LEFT JOIN上显示任何记录,除非我指定“MatchID”(CASE_MBR_KEY) value,意思是通过删除“where”子句,我的外连接不产生任何记录,即使CTE数据中有CASE_MBR_KEY值.

WITH CTE AS
(
SELECT TEMP.BEAS_KEY, 
       TEMP.CASE_MBR_KEY,
       TEMP.FULLNAME,
       TEMP.BIRTHDT,
       TEMP.LINE1,
       TEMP.LINE2,
       TEMP.LINE3,
       TEMP.CITY,
       TEMP.STATE,
       TEMP.POSTCD,
       ROW_NUMBER() 
  OVER(ORDER BY TEMP.BEAS_KEY) R
  FROM TMP_BEN_ASSIGNEES TEMP
  --WHERE TEMP.CASE_MBR_KEY = 4117398
)

这是因为ROW_NUMBER值,给定记录的数量不一定是1或2,所以我尝试了以下,但得到ORA-01799:列可能不是外连接到子查询

--// BEN ASSIGNEE 1
LEFT JOIN CTE BASS1
  ON BASS1.CASE_MBR_KEY = C.CASE_MBR_KEY  
 AND BASS1.R IN (SELECT min(R) FROM CTE A WHERE A.CASE_MBR_KEY = C.CASE_MBR_KEY)
--// END BA1 

--// BEN ASSIGNEE 2
LEFT JOIN CTE BASS2
  ON BASS2.CASE_MBR_KEY = C.CASE_MBR_KEY  
 AND BASS2.R IN (SELECT MAX(R) FROM CTE B WHERE B.CASE_MBR_KEY = C.CASE_MBR_KEY)
--// END BA2 

**编辑2 **

通过将Row number子句移动到查询的“Where”部分而不是JOIN子句中来修复上述问题.似乎现在工作.

最佳答案 您可以将CTE与ROW_NUMBER()一起使用2 LEFT JOIN或PIVOT.

SQL Fiddle

查询多个左连接

WITH CTE as 
(
  SELECT MatchID,Owner,ROW_NUMBER()OVER(ORDER BY Owner) r FROM t2
)
select T1.ID, T1.Person, t2.Owner as Owner1, t3.Owner as Owner2 
FROM T1
LEFT JOIN CTE T2
ON  T1.ID = T2.MatchID AND T2.r = 1
LEFT JOIN CTE T3
ON T1.id = T3.MatchID AND T3.r = 2;

用PIVOT查询

WITH CTE as 
(
  SELECT MatchID,Owner,ROW_NUMBER()OVER(ORDER BY Owner) R FROM t2
)
SELECT ID, Person,O1,O2
FROM T1
LEFT JOIN CTE T2
ON  T1.ID = T2.MatchID
PIVOT(MAX(Owner) FOR R IN (1 as O1,2 as O2));

产量

ID  PERSON  OWNER1  OWNER2
1   John    Maxwell Peter
点赞