我想合并两个查询。
我有Query1返回一些ID。
然后我有Query2,首先检查表中是否存在一些ID。如果不是,那么结果将是Query1返回的ID。
如果是,那么我想要Query1和Query2返回的常见ID,如Query1和Query2返回的Ids的交叉。
那么我怎么能在一个查询中做到这一点。
答案 0 :(得分:1)
这可以使用DECODE和CASE语句的组合来实现
SELECT DISTINCT BT1.ID
FROM BUFFER_TABLE_1 BT1, BUFFER_TABLE_2 BT2
WHERE DECODE((SELECT COUNT(BT1.ID)
FROM BUFFER_TABLE_1 BT1, BUFFER_TABLE_2 BT2
WHERE BT1.ID = BT2.ID),
0,
'TRUE',
(SELECT CASE
WHEN BT1.ID = BT2.ID THEN
'TRUE'
ELSE
'FALSE'
END
FROM DUAL)) = 'TRUE'
ORDER BY BT1.ID
主要部分是在解码中使用的地方 如果来自两个表的匹配ID的计数是ZERO,则从第一个表(BUFFER_TABLE_1)返回所有ID。 但是,如果此计数大于0,则表中的ID都匹配,并且只返回公共ID
希望有所帮助
答案 1 :(得分:0)
(对于那些已经阅读过我的答案的人:由于@nawfal我想保留的评论,它已被大量重新编辑)
首先,我想澄清一下,我理解你的问题是正确的。
你有零件:
select id from table1
生成Result1 select id from table2 where <some condition>
生成Result2 select count(id) > 0 from table2 where <some condition>
决定使用什么结果如果3.返回超过1,那么您需要1. AND 2返回的行(但不是仅由1返回的行。或者只返回2。)
如果3.返回0,则需要1的结果。
- &GT;解决方案是在视图中使用3.并在union语句TWICE的where子句中选择它。
像这样:
SELECT t1.id FROM table1 t1 WHERE
(SELECT COUNT(t2.id) from table2 t2 where <some condition>) = 0
UNION
select t2.id from table2 t2 WHERE <some condition>
AND t2.id IN (SELECT t1.id FROM table1 t1)
AND (SELECT COUNT(t2.id) from table2 t2 where <some condition>) > 0
两个部分中的一个将始终为空(因为查询3.不能同时为= 0和&gt; 0)