2012-08-10 71 views
-1

請考慮以下查詢,其中兩個集合需要被相同的Location過濾。是否有更高效的/高效的方法,因此Location篩選器僅在兩個套件中應用一次,或者您是否被迫分別對每個套件應用相同的篩選器?SQL集合操作中的WHERE子句

SELECT * 
FROM Orders 
WHERE Quantity BETWEEN 1 AND 100 
AND Location = 'SE' 

EXCEPT 

SELECT * 
FROM Orders 
WHERE Quantity BETWEEN 50 AND 75 
AND Location = 'SE'; 

注:並不想重構組操作每SE-它只是一個虛擬的例子。我的問題只是關於如何在集合操作中處理常用的WHERE子句。

回答

1

您可以用CTE做到這一點:

with ord (Column1, Column2) as 
(
    SELECT Column1, Column2 
    FROM Orders 
    WHERE Location = 'SE' 
) 
SELECT * 
FROM ord 
WHERE Quantity BETWEEN 1 AND 100 

EXCEPT 

SELECT * 
FROM ord 
WHERE Quantity BETWEEN 50 AND 75 

如果熱膨脹係數不到位,你可以做同樣的事情用視圖。

+0

在列部分不清晰 - 這是否會使我的結果並排? – Yarin 2012-08-10 02:47:21

+0

使用CTE時,必須明確命名列而不是使用'*'。這就是'Column1'和'Column2'表示的地方,因爲你沒有提供模式。 – RedFilter 2012-08-10 02:50:26

+0

啊 - 明白了。好吧,這可能是什麼後 – Yarin 2012-08-10 02:50:55

4

我會重新因素的查詢簡單:

SELECT * 
FROM Orders 
WHERE Quantity BETWEEN 1 AND 100 
AND Quantity NOT BETWEEN 50 AND 75 
AND Location = 'SE'; 
+0

不,我需要單獨的集合操作 - 我只是在常見的過濾器(代碼粘貼來自維基百科設置的例子 - 我不需要重構的實際集合)感興趣 – Yarin 2012-08-10 02:35:53

+0

@Yarin你會做得更好發佈您需要幫助的查詢,而不是錯誤地表示您的情況。 – RedFilter 2012-08-10 02:38:17

0
SELECT * 
FROM Orders 
WHERE ((Quantity BETWEEN 1 AND 49) OR (Quantity BETWEEN 76 AND 100)) 
AND Location = 'SE' 

試試這個查詢,並確保它取得相同的結果。

0

我會做這種方式:

SELECT * 
FROM Orders 
WHERE ((Quantity BETWEEN 1 AND 49) 
OR (Quantity BETWEEN 76 AND 100)) 
AND Location = 'SE'; 
+0

這個邏輯是不正確的 - 記住'BETWEEN'是包含性的。 – RedFilter 2012-08-10 02:40:02

+0

@RedFilter忘了這一點,謝謝。編輯。 – 2012-08-10 02:51:10

+0

現在你正在複製@sundar已經給出的答案。不確定這有多大價值。 – RedFilter 2012-08-10 02:52:18

-1
SELECT * 
FROM Orders o1 
WHERE Quantity BETWEEN 1 AND 100 
AND Location = 'SE' 
AND NOT EXISTS (SELECT 1 FROM ORDERS o2 
       WHERE QUANTITY BETWEEN 50 AND 75 
       AND Location = 'SE' 
       AND o1.ORDERS_ID = o2.ORDERS_ID) 
+0

從這個問題:*是否有一個更有效率/性能的方法,即位置過濾器**僅在兩個集合上應用一次** * – RedFilter 2012-08-10 02:40:51

1

您可以使用AND NOT而不是EXCEPT來處理設置的操作,並在不同平臺上提供更大的支持。

我認爲有些事情值得一提,一個總結:

  1. 將最有可能表達第一。
  2. 先放最少複雜的表情。
  3. 使用更多和更少的搜索。

反向點1 & 2如果您使用Oracle,則由於從右到左評估而不是從左到右。

+0

Lau-你能擴展3嗎? – Yarin 2012-08-10 03:03:10

+0

@Yarin:第3點我指的是使用比較運算符(例如>,<,==)而不是邏輯運算符(例如ANY,BETWEEN,EXIST)。這是由於比較操作涉及單索引搜索,而一些邏輯操作涉及多索引搜索。一個例子(雖然可能不是確切的)可以在這裏找到(http://www.devx.com/dbzone/Article/36339/1954) – 2012-08-10 03:19:37

+0

謝謝 - 一些好點 – Yarin 2012-08-10 03:22:55