2013-12-11 32 views
0

這是我的查詢。在SQL中允許使用IN運算符重複

SELECT *, COUNT(A) AS FREQUENCY FROM TABA WHERE ID IN 
(
(SELECT ID FROM TABA WHERE XXXXX) 
UNION ALL 
(SELECT ID FROM TABA WHERE XXXXX) 
UNION ALL 
(SELECT ID FROM TABA WHERE XXXXX) 
) 
GROUP BY A 
ORDER BY FREQUENCY 

與此查詢我總是得到的頻率值設爲1

假設說,下面的子查詢給出了下面的結果。

(SELECT ID FROM TABA WHERE XXXXX) 
UNION ALL 
(SELECT ID FROM TABA WHERE XXXXX) 
UNION ALL 
(SELECT ID FROM TABA WHERE XXXXX) 

結果:

1 
2 
3 
2 
3 
4 
2 

現在在使用時完全查詢只給唯一的記錄。

我想結果按FREQUENCY排序,在這個例子中,例如數字3的頻率是2。 我該怎麼做?我希望我有道理。

基本上,我在表中有很多列,我想執行搜索並根據搜索項的頻率返回結果。

+0

請注意COUNT函數的行爲;如果任何記錄在「A」列中包含NULL值,則該記錄不會被「COUNT(A)」計數。這可能是你想要的行爲,我不知道,但只是想提到它。 –

+0

您是否正在計算在A列中找到的每個特定值的出現次數,或者您是否試圖計算特定記錄與聯合選擇語句中的3個條件之一相匹配的次數?如果是後者,那麼你的頻率只能是0,1,2或3;你的意圖是? –

回答

0

你應該能夠使用以獲得正確的頻率值以下:

SELECT ID, COUNT(A) AS FREQUENCY 
FROM (
(SELECT ID, A FROM TABA WHERE XXXXX) 
UNION ALL 
(SELECT ID, A FROM TABA WHERE XXXXX) 
UNION ALL 
(SELECT ID, A FROM TABA WHERE XXXXX) 
) TABA_UNION 
GROUP BY ID 

如果你需要將它與塔巴表等欄目,類似於原始查詢是如何結合寫的,那麼你可以這樣做:

SELECT TABA.*, ISNULL(TABA_FREQUENCY.FREQUENCY, 0) as FREQUENCY 
FROM TABA 
LEFT OUTER JOIN (
    SELECT ID, COUNT(A) AS FREQUENCY 
    FROM (
    (SELECT ID, A FROM TABA WHERE XXXXX) 
    UNION ALL 
    (SELECT ID, A FROM TABA WHERE XXXXX) 
    UNION ALL 
    (SELECT ID, A FROM TABA WHERE XXXXX) 
    ) TABA_UNION 
    GROUP BY ID 
) TABA_FREQUENCY ON 
    TABA_FREQUENCY.ID = TABA.ID 

左外連接使用,以包括塔巴任何記錄不符合任何在被聯合塞萊規定的標準,而不是內部聯接ct聲明。

1
SELECT ID, COUNT(*) AS FREQUENCY 
FROM TABA 
WHERE XXXXX 
    OR XXXXX 
    OR XXXXX 
GROUP BY ID 
ORDER BY COUNT(*) 
+0

在OP中,如果單個記錄匹配所有3個條件,則該記錄的ID將在結果聯合中出現3次。在此查詢中,該記錄只會計入一次,即使它符合所有3個條件。 –

+0

是的,ID會顯示3次..但是這在IN類中...即使你在IN子句中有模糊,也不意味着你的結果會被重複。 IN clasue中的那些聯盟基本上是OR的 –

+0

好吧,但是這看起來像原始查詢的重述,OP說它沒有給出期望的結果(儘管我注意到OP的查詢是由A分組的,似乎是正確的)。如果這只是與原始查詢做同樣的事情,那麼它並不真正回答這個問題。 –