使具有多个where条件和变量的SQL查询更加高效
我有一个查询,它确实得到了我需要的结果,但是速度非常慢,而且肯定有更好的方法来实现这一点,因为我需要定期运行它 每个where子句都有两个变量,它们总是相同的数字,但我需要将其用于50+个BigID,示例显示了3,但我会将其用于bigid1到50+ 我不确定如何缩短这个时间,因为有两个变量,其中一个位于子查询中,另一个是必需的组。 任何帮助或指向正确方向都将不胜感激。谢谢使具有多个where条件和变量的SQL查询更加高效,sql,sql-server,Sql,Sql Server,我有一个查询,它确实得到了我需要的结果,但是速度非常慢,而且肯定有更好的方法来实现这一点,因为我需要定期运行它 每个where子句都有两个变量,它们总是相同的数字,但我需要将其用于50+个BigID,示例显示了3,但我会将其用于bigid1到50+ 我不确定如何缩短这个时间,因为有两个变量,其中一个位于子查询中,另一个是必需的组。 任何帮助或指向正确方向都将不胜感激。谢谢 SELECT BigID,count(LittleID) FROM Table1 where (
SELECT BigID,count(LittleID)
FROM Table1
where ( (BigID=1 and LittleID not in (SELECT LittleID FROM Table2 where BigID=1)) or
(BigID=2 and LittleID not in (SELECT LittleID FROM Table2 where BigID=2)) or
(BigID=3 and LittleID not in (SELECT LittleID FROM Table2 where BigID=3)) )
group by BigID
一种方法是相关子查询:
SELECT t1.BigID, count(t1.LittleID)
FROM Table1 t1
WHERE t1.BigID IN (1, 2, 3) and
t1.LittleID not in (SELECT t2.LittleID
FROM Table2 t2
WHERE t2.BigID = t1.BigId
)
GROUP BY t1.BigID
请填写表格定义。因此,我们知道如果LittleID和BigID存在于一个或两个表中……通常更有效的方法是删除左连接,并在WHERE子句中使用NOT exist从表2中选择1作为t2,其中t1.LittleID=t2.LittleID和t1.BigID=t2.BigID@好消息。。。在这种情况下,我们可以得到半左连接而不是左连接。通常,构造使用NOT EXISTS的查询比使用NOT in的查询更好,因为可能会对NULL值产生副作用。这在这个例子中可能不起作用,但我更喜欢使用副作用最小的结构。否则,性能通常相同。
SELECT t1.BigID, count(t1.LittleID)
FROM Table1 t1
WHERE t1.BigID IN (1, 2, 3) and
t1.LittleID not in (SELECT t2.LittleID
FROM Table2 t2
WHERE t2.BigID = t1.BigId
)
GROUP BY t1.BigID
SELECT Table1.BigID,
COUNT(Table1.LittleID)
FROM Table1
LEFT JOIN Table2 ON Table1.LittleID = Table2.LittleID
AND Table1.BigID = Table2.BigID
WHERE Table2.LittleID IS NULL
AND Table1.BigID IN (1, 2, 3)
GROUP BY Table1.BigID