Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使具有多个where条件和变量的SQL查询更加高效_Sql_Sql Server - Fatal编程技术网

使具有多个where条件和变量的SQL查询更加高效

使具有多个where条件和变量的SQL查询更加高效,sql,sql-server,Sql,Sql Server,我有一个查询,它确实得到了我需要的结果,但是速度非常慢,而且肯定有更好的方法来实现这一点,因为我需要定期运行它 每个where子句都有两个变量,它们总是相同的数字,但我需要将其用于50+个BigID,示例显示了3,但我会将其用于bigid1到50+ 我不确定如何缩短这个时间,因为有两个变量,其中一个位于子查询中,另一个是必需的组。 任何帮助或指向正确方向都将不胜感激。谢谢 SELECT BigID,count(LittleID) FROM Table1 where (

我有一个查询,它确实得到了我需要的结果,但是速度非常慢,而且肯定有更好的方法来实现这一点,因为我需要定期运行它

每个where子句都有两个变量,它们总是相同的数字,但我需要将其用于50+个BigID,示例显示了3,但我会将其用于bigid1到50+

我不确定如何缩短这个时间,因为有两个变量,其中一个位于子查询中,另一个是必需的组。 任何帮助或指向正确方向都将不胜感激。谢谢

 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