2016-01-08 16 views
2

我有這個疑問這確實讓我需要的結果,但令人難以置信的是緩慢的,肯定有必須這樣做,因爲我需要定期運行的更好的方法。製作SQL查詢與多個那裏的條件和變量更有效

每個where子句中有兩個變量,這將始終是相同的號碼,但我需要與50多個BigIDs使用,該示例顯示了3個,但我會做到這一點對BigID 1到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 
+0

表定義信息,請。 (因此,我們知道,如果LittleID和BigID在一個或兩個表中存在...) – jarlh

回答

2

一種方法是一個相關子查詢:

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 
+2

的'離開它一般是更好地構建使用'不超過一個與EXISTS'查詢'不是因爲關於'NULL'值可能產生的副作用IN'。這在這種情況下可能不起作用,但我更願意堅持那些副作用最小的結構。否則,性能通常是相同的。 –

1
SELECT t1.BigID, COUNT(t1.LittleID) 
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.LittleID = t2.LittleID AND t1.BigID = t2.BigID 
WHERE t1.BigID IN (1, 2, 3) 
    AND t2.LittleID IS NULL 
GROUP BY t1.BigID 
+1

它通常更有效砸'LEFT JOIN',並使用'NOT EXISTS(SELECT 1 FROM表2爲T2 WHERE t1.LittleID = t2.LittleID AND t1.BigID = t2.BigID)'在WHERE子句中。 [參考價格](http://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join) –

+0

@TT很好的說明......在這種情況下,我們可以得到'SEMI LEFT JOIN'代替JOIN' – Devart

1
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