【问题标题】:SQL: Getting possible values for 'IN' operator from two different tablesSQL:从两个不同的表中获取“IN”运算符的可能值
【发布时间】:2011-04-28 14:45:18
【问题描述】:

我有 3 个具有以下架构的表:

Table1 列:ID MsgNum Msg 表 2 列:ID MsgNum SystemId 表 3 列:ID MsgNum IncidentNum

我想在从表 2 和表 3 中选择的值范围内获取表 1 中的所有项目。

从表 2 中,MsgNum 的可能值是使用以下 SQL 获得的:

SELECT Table2.MsgNum from Table2 WHERE SystemId = 'Sys-0001'

从表 3,

SELECT Table3.MsgNum from Table3 WHERE IncidentNumber = 'Incident-0001'

现在,我想使用从前面2个SELECT语句中获得的MsgNum值的组合来获取Table1中的对应行,如下所示:

SELECT * from Table1 where MsgNum IN ( SELECT Table2.MsgNum from Table2 WHERE SystemId = 'Sys-0001'  OR  SELECT Table3.MsgNum from Table3 WHERE IncidentNumber = 'Incident-0001')

但该 SQL 使用 Interactive SQL 失败。我做错了什么?

【问题讨论】:

  • 如果这些答案中的任何一个解决了您的问题,您应该将其标记为答案,因为这有助于社区以后更快地找到答案。

标签: sql


【解决方案1】:

你为什么不使用 EXISTS 来代替

SELECT * from Table1 t1 
where EXISTS ( SELECT t2.MsgNum from Table2 t2 
 WHERE t2.SystemId = 'Sys-0001' AND t2.MsgNum = t1.MsgNum)
OR  EXISTS (SELECT t3.MsgNum from Table3 t3 
 WHERE t3.IncidentNumber = 'Incident-0001' AND t3.MsgNum = t1.MsgNum)

【讨论】:

  • 感谢您的回答。但是,这看起来比联盟复杂得多,特别是考虑到我的问题已简化。所以我倾向于使用Union。
  • 你应该尝试both。根据你的数据库和MsgNum的分布,一个可能会明显更快。 (可能是 UNION 版本,但我学会了不要赌 SQL 优化器的行为。)
【解决方案2】:

你是说 UNION 吗?

SELECT * 
from Table1 
where MsgNum IN 
( 
SELECT Table2.MsgNum from Table2 WHERE SystemId = 'Sys-0001'  
UNION 
SELECT Table3.MsgNum from Table3 WHERE IncidentNumber = 'Incident-0001'
)

【讨论】:

    【解决方案3】:

    使用 UNION 命令将两个查询放在一起

    SELECT * from Table1 where MsgNum IN (
     SELECT Table2.MsgNum from Table2 WHERE SystemId = 'Sys-0001'
       UNION
       SELECT Table3.MsgNum from Table3 WHERE IncidentNumber = 'Incident-0001')
    )
    

    【讨论】:

    • 嗯。联盟做到了,但我不明白马丁发表的担忧。能否请您详细说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2021-08-21
    • 1970-01-01
    • 2011-10-31
    相关资源
    最近更新 更多