我有两张桌子:
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)
但是,该查询运行速度非常慢。获得我需要的结果的最有效方法是什么?
答案 0 :(得分:4)
有类似的question
我认为会更好
SELECT COUNT(*)
FROM TABLE1
WHERE NOT EXISTS (SELECT Table1Id FROM TABLE2 WHERE TABLE2.Table1Id = TABLE1.Table1Id AND UserID = 1)
我也会检查索引,如ck建议
答案 1 :(得分:1)
怎么样?
select Table1Id from TABLE1
minus
select Table1Id from TABLE2 where id_user = 1
我不确定,它的MsSql支持减去。如果没有,您应该尝试相关的子查询。
答案 2 :(得分:1)
只要选择返回相同的字段类型/顺序,您也可以使用'EXCEPT / MINUS'相交来获得两个表之间的差异。
SELECT TABLE1ID
FROM TABLE1
EXCEPT -- or MINUS in Oracle
SELECT TABLE1ID
FROM TABLE2
WHERE USER_ID = 1
答案 3 :(得分:-1)
请参阅How to do a Select in a Select
另外,请确保您查询的任何字段都有合适的索引。