【问题标题】:SQL Query HelpSQL 查询帮助
【发布时间】:2010-10-20 03:35:32
【问题描述】:

复制:

How to do a Select in a Select

我有 2 张桌子:

TABLE1
Table1Id

TABLE2
Table2Id
Table1Id
UserId

TABLE2 中有数千个条目。我想返回一个 TABLE1 条目列表,其中 TABLE2 中没有针对特定用户的条目。因此,TABLE2 中没有外键条目。像这样的查询:

select count(*) from TABLE1 where Table1Id not in (
select Table1Id from TABLE2 where id_user = 1)

但是,该查询运行非常缓慢。获得所需结果的最有效方法是什么?

【问题讨论】:

标签: sql tsql


【解决方案1】:

有一个类似的question

我觉得会更好

SELECT COUNT(*) 
FROM TABLE1 
WHERE NOT EXISTS (SELECT Table1Id FROM TABLE2 WHERE TABLE2.Table1Id = TABLE1.Table1Id AND UserID = 1)

我也会按照 ck 的建议检查索引

【讨论】:

    【解决方案2】:

    怎么样

    select Table1Id from TABLE1 
    minus
    select Table1Id from TABLE2 where id_user = 1
    

    我不确定,MsSql 是否支持减号。如果没有,您应该尝试关联子查询。

    【讨论】:

      【解决方案3】:

      只要选择返回相同的字段类型/顺序,您还可以使用“EXCEPT/MINUS”相交来仅获取两个表之间的差异。

      SELECT TABLE1ID
      FROM TABLE1
      EXCEPT -- or MINUS in Oracle
      SELECT TABLE1ID
      FROM TABLE2
      WHERE USER_ID = 1
      

      【讨论】:

        【解决方案4】:

        How to do a Select in a Select

        另外,请确保您查询的所有字段都有合适的索引。

        【讨论】: