我遇到了一个问题,我想联接几个表来创建一个新视图。到目前为止,该视图工作正常,但我遇到了以下问题:
我有一个名为“MyTable1”的表。此表中有一个ID。我有第二个名为“MyTable2”的表。此表通过ID列引用到“MyTable1”。
我的表格1:
ID
567
我的表格2:
ID MyTable1_ID object_ID
1 567 896
2 567 967
3 567 756
代码:
SELECT
MyTable1.ID,
MyTable2.ID,
MyTable2.object_ID
FROM
MyTable1
LEFT JOIN MyTable2 ON MyTable2.MyTable1_ID = MyTable1.ID
输出:
MyTable1.ID MyTable2.ID MyTable2.object_ID
567 1 896
567 2 967
567 3 756
预期输出:
MyTable1.ID MyTable2.ID MyTable2.object_ID
567 1;2;3 896;967;756
我尝试使用LISTAGG
,但也只得到3行输出:
SELECT
MyTable1.ID,
MyTable2.ID,
MyTable2.object_ID
CASE WHEN (SELECT count(*) FROM MyTable2 JOIN MyTable1 ON MyTable2.MyTable1_ID = MyTable1.ID having count(*) > 1) > 1 THEN LISTAGG(MyTable2.object_id, '; ') WITHIN GROUP (order by MyTable2.object_id) ELSE MyTable2.object_id END
FROM
MyTable1
LEFT JOIN MyTable2 ON MyTable2.MyTable1_ID = MyTable1.ID
有人能帮帮我吗?
谢谢
2条答案
按热度按时间fnx2tebb1#
但是,要注意,如果连接长度不超过4000个字符,listagg也可以工作。
因此,在Oracle livesql中,我运行了以下命令:
然后运行它只显示了一行。不明白你怎么说它为你获取了三行。
bxjv4tth2#
提供了样本数据:
如果您可以使用不带OVER(Partition By t1.ID)的LISTAGG()分析函数:
越有可能需要按t1.ID进行分区,则应使用DISTINCT关键字排除重复行(对于大数据集,性能成本可能较高):
如果是这种情况,你可以这样做: