【问题标题】:Merge two sql queries with if condition使用 if 条件合并两个 sql 查询
【发布时间】:2012-04-21 14:41:31
【问题描述】:

我想合并两个查询。

我有 Query1 返回一些 Id。

然后我有 Query2,它首先检查表中是否存在某些 Id。如果不是,则结果将是 Query1 返回的 Id。

如果是,那么我想要 Query1 和 Query2 返回的常见 Id,例如 Query1 和 Query2 返回的 Id 的交集。

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

【问题讨论】:

  • 你可能想看看这个:stackoverflow.com/questions/38549/… 看看基本上被称为 LEFT OUTER JOIN 和 INNER JOIN 分别满足您的要求
  • 目前我在数据表中得到 Query1 的结果,在其他数据表中得到 Query2 的结果。然后遍历这些数据表,获取常见的 Id 并将其插入第三个数据表中。我想尽量减少这种情况。
  • 是的,相反,您可以进行一个查询,这也几乎是标准的。使用 JOIN .. 您对此不彻底吗?
  • @nawfal - 对连接概念很清楚,但在这种情况下没用。
  • @user1049021 您已经成为会员一年多了,已经提出了 10 个问题,但没有接受一个。我不敢相信所有这些都不值得和接受的钩子。 (如果您不明白我的意思,请参阅常见问题解答。)

标签: sql sql-server oracle select intersect


【解决方案1】:

(对于已经阅读我的回答的人:由于我想保留@nawfal 的 cmets,它已被大量重新编辑)

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

你有零件:

  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> 这决定了使用什么结果

如果 3. 返回超过 1,那么您需要由 1. AND 2. 返回的行(但不是仅由 1. OR 仅由 2 返回的行)

如果 3. 返回 0,那么您想要 1 的结果。

-> 解决方案是在一个视图中拥有 3. 并在联合语句 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 和 > 0)

【讨论】:

  • 我的查询是: select * from table1 select * from table2 from table2 where 我想要的是: if( select count(*) from table2 from table2 where >0 ) 然后 // 将来自 query1 和 query2 的 ID 相交 else //来自 query1 的 ID 希望现在我的问题更清楚了
  • @user1049021 请在对问题的编辑中发布您的查询。
  • No Union all 将给出重复的条目
  • @AngeloNeuschitzer 这正是我想到的,但它并没有给他想要的结果。当 table2 中有条目时,第一个查询返回 0 条记录,并且 union 不再起作用。在那种情况下,他需要一种相交.. 几处更正:将联合全部改为联合,将 == 更改为 =。他需要的是某种控制流逻辑
  • @nawfal 不,Union all 将连接所有选择。如果您确保第一个查询仅在第二个查询不产生结果时才会产生结果,那么您将始终拥有第一个或第二个但永远不会同时拥有。
【解决方案2】:

这可以使用 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 的计数为零,则从第一个表 (BUFFER_TABLE_1) 返回所有 ID。 但是,如果这个计数大于 0,那么两个表中的 ID 都匹配,并且只返回公共 ID

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2016-05-26
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2020-12-23
    • 1970-01-01
    相关资源
    最近更新 更多