2012-10-03 65 views
3

我是一個完整的SQL小白,所以我對下面的SQL屠宰道歉...... 下面是我想要做的僞代碼:在同一個表上加入多個過濾的select查詢?

count( 
    join( 
     select(* from table X where a='stuff' and b='junk') as X1 
     select(* from table X where a='arg' and b='blarg') as X2 
     select(* from table X where a='narf' and b='foo') as X3 
    ) where X1.c = X2.c = X3.c 
) 

是否有可能得到這個結果一個查詢?

+0

*這個結果* - 結果是什麼? – RedFilter

+0

你想要表中所有項目的結果是a ='stuff'還是b ='junk'OR a ='arg'和b ='blarg'OR a ='narf'和b ='foo'?或者你只是在尋找只有三種物品? – jTC

+1

請提供樣本數據和結果。你的僞代碼可能不會捕獲你真正想要的東西。 –

回答

1

如果我猜你真正想要的,這是個「C」其中有三個在ab列條件的計數。如果是這樣的話,下面的工作:

select count(*) 
from (select c 
     from table X 
     group by c 
     having sum(CASE WHEN a = 'stuff' AND b = 'junk' THEN 1 ELSE 0 END) > 0 and 
      sum(CASE WHEN a = 'arg' AND b = 'blarg' THEN 1 ELSE 0 END) > 0 and 
      sum(CASE WHEN a = 'narf' AND b = 'foo' THEN 1 ELSE 0 END) > 0 
    ) t 
+0

驚人的答案!戈登,你能提供你對我答案的看法嗎? –

+2

我們都是同樣地解釋僞代碼(無論思維是好還是壞都是意見問題)。當多行滿足其中一個條件時,您的答案會超過「c」。當SQL的新手們經常要求'計數'時,他們的意思是「計數(不同)」。另外,我強烈希望使用'having'子句來測試集合成員資格,因爲這是更通用的方法。 –

1
select count(*) from 

(select * from table X where a='stuff' and b='junk') x1 

join 

(select * from table X where a='arg' and b='blarg') x2 

on x1.c=x2.c 

join 

(select * from table X where a='narf' and b='foo') X3 

on x2.c=x3.c 
0
SELECT c, 
     SUM(CASE WHEN a = 'stuff' AND b = 'junk' THEN 1 ELSE 0 END) AS X1, 
     SUM(CASE WHEN a = 'arg' AND b = 'blarg' THEN 1 ELSE 0 END) AS X2, 
     SUM(CASE WHEN a = 'narf' AND b = 'foo' THEN 1 ELSE 0 END) AS X3 
    FROM table_X 
    GROUP BY c 
0

從表X

你想三套記錄的每一個都是從同一個表X

  • 選擇X1過濾表X中的記錄,其中a ='stuff'和b ='junk'
  • X2過濾表X中的記錄,其中a ='arg'和b ='blarg'
  • X3濾波器在表X,其中a =「NARF」和b =「富」

到現在爲止,我們有屬於X的獨立子集三「邏輯視圖」的記載,分別稱爲X1,X2 ,X3

加入(...),其中X1.c = X2.c = X3.c

解釋可能有點含糊,混亂,讓我們嘗試:

字面上: c是表中的一個字段的名稱X

  • 情況A:c是一個鍵(唯一約束的),則每個X(因而X1,X2,X3)的記錄對C有唯一值,因此不存在X1.c = X2.c = X3.c的任何記錄;在這種情況下的解決方案就像==> SELECT 0
  • case B:c不是鍵,而是可能包含重複值的字段;我們可以將這個案例分成兩個(或更多)可能的解釋
    • 案例B1:我們只想考慮和計算那些X1.c = X2.c = X3.c的記錄;這包括來自子集X1,X2,X3的那些只有c值存在於所有其他子集中的記錄。
    • 情況B2:我們要計算X1.c,X2.c,X3的所有可能的組合。ç

所有這些情況下顯得特別奇怪,所以我提前另一種解釋,最常見的情況,但不是字面上秉承的理念加入:

我們要算X1,X2的工會,X3;
在這種情況下,解決辦法是:

SELECT COUNT(*) FROM X 
WHERE (a='stuff'AND b='junk') 
    OR (a='arg' AND b='blarg') 
    OR (a='narf' AND b='foo') 

警告:我perfecly瞭解到,「聯盟」是絕對不同的是「聯接」,因此這種解釋可能是完全以錯的,如果你真的意味着加盟,但探索這種含義的可能性似乎很有用。