使用if条件合并两个sql查询

时间:2012-04-09 06:09:25

标签: sql sql-server oracle select intersect

我想合并两个查询。

我有Query1返回一些ID。

然后我有Query2,首先检查表中是否存在一些ID。如果不是,那么结果将是Query1返回的ID。

如果是,那么我想要Query1和Query2返回的常见ID,如Query1和Query2返回的Ids的交叉。

那么我怎么能在一个查询中做到这一点。

2 个答案:

答案 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我想保留的评论,它已被大量重新编辑)

首先,我想澄清一下,我理解你的问题是正确的。

你有零件:

  1. select id from table1生成Result1
  2. select id from table2 where <some condition>生成Result2
  3. select count(id) > 0 from table2 where <some condition>决定使用什么结果
  4. 如果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)

相关问题