2016-04-06 83 views
0

我試圖從表中返回DISTINCT ID(如果它符合特定條件)。根據少數條件返回不同的ID

  1. 的ID必須包含的1,26,33,49(全部)CID
  2. 的ID不應該包含38或46或67

這裏CID是表。

enter image description here

這是我到目前爲止有:如果

SELECT DISTINCT(c1.id) FROM cte c1 
LEFT JOIN cte c2 
ON c1.id = c2.ID 
AND c2.CID = 38 
where c2.id IS null 

這隻能我指定不應該呈現一個ID。如果我有

AND c2.CID IN (38,46,67) 

替換此

AND c2.CID = 38 

這不會回到我正確的ID。另外,如果我爲c1.CID添加條件以包含ID 1,26,33,49它也會返回不正確的ID。

根據這個示例表,我應該只能找回ID 12345

這裏的SQLFIDDLE.

我試圖讓這個輸出,而不使用subquery

有什麼建議嗎?

+0

我不明白爲什麼這個查詢不起作用:「從yourTable中選擇不同的ID,其中CID在(1,26,33,49)」 – FLICKER

+0

這是行不通的。一個'ID'可以有多個不同的'CID'。如果我只做一個選擇,那麼它只會排除該行,但它不會排除該ID。 – smr5

+0

@burzum'criteria'是複數,單數是'標準',因此'標準'不是一個單詞。 –

回答

3

SQL Fiddle

使用條件聚集。

SELECT id 
FROM cte 
group by id 
having sum(case when cid in (1,26,33,49) then 1 else 0 end) = 4 
and sum(case when cid in (38,46,67) then -1 else 0 end) = 0 
+0

謝謝。您的解決方案適用於我。你能解釋一下'sum'在做什麼嗎?我理解這個例子,'4'代表所有的ID必須存在,但我不明白'sum'的目的。 – smr5

+0

你爲包含這些值的行分配1,然後對每個id進行求和,並檢查它是否爲4.對於應該排除的cid,你可以做同樣的事情,但將-1賦給具有3個cid的行,然後進行求和。如果這些cid中的任何一個出現在給定的id中,那麼總和不會是0,並且條件失敗並且這些id不會被返回。 –

+0

太棒了。謝謝你的解釋。 – smr5

0

爲什麼你沒有做過這樣的事情?

AND c2.CID = 38 OR c2.CID = 46 OR c2.CID = 67 

AND c2.CID Like (38,46,67) 
1

我已經創建了一個工作查詢,但看起來很奇怪:)

-- An ID must contain CID of 1,26,33,49 (all) 
-- An ID should NOT contain CID of 38 or 46 or 67 
SELECT valid.ID 
FROM (
    SELECT ID, CID 
    FROM CTE 
    WHERE CID IN (1,26,33,49) 
    GROUP BY ID, CID 
) AS valid 
WHERE valid.ID NOT IN (
    SELECT ID FROM CTE WHERE CID IN (38,46,67) GROUP BY ID, CID 
) 
GROUP BY valid.ID 
HAVING COUNT(valid.CID) = 4 

工作sqlfiddle:http://sqlfiddle.com/#!6/9c862/41

附: '4'是強制性ID的數量。如果你改變參數的數量 - HAVING COUNT子句應該相應地更新。

+0

@pavel_morshenyuk我建議編輯爲:HAVING COUNT(DISTINCT valid.CID)= 4您需要考慮給定CID的可能多個條目。 –

+0

@ ricardo-c感謝您的建議!可能是有意義的 –

1

EXCEPT與UNION在說話方面相反。

SELECT c1.id 
FROM cte c1 
WHERE c1.CID IN(1,26,33,49) 
GROUP BY c1.id 
HAVING COUNT(DISTINCT c1.CID) = 4 

EXCEPT 

SELECT DISTINCT c1.id 
FROM cte c1 
WHERE c1.CID IN(38,46,67) 
+0

其他例子沒有考慮重複條目例如四個重複記錄ID 12345和CID 26 –

+0

奇怪。它在SQLFIDDLE中工作,但是當我對我的表運行相同的查詢時,我沒有返回結果。 – smr5

+0

@burzum umm也許你的表是不同的,請嘗試從sqlfiddle這兩個部分複製; 'build schema'和'run sql'並在你的SSMS中進行測試。 –

1

如果你願意使用臨時表,這個工作。這裏是SQL小提琴: http://sqlfiddle.com/#!6/9c862/39/0

Select 
    C.ID 
,C.CID 
,Case C.CID 
    When 1 then 'Y' 
    When 26 then 'Y' 
    When 33 then 'Y' 
    When 49 then 'Y' 
    Else 'N' 
    End as "Keep" 
,Case C.CID 
    When 38 then 'Y' 
    When 46 then 'Y' 
    When 67 then 'Y' 
    Else 'N' 
    End as "Remove" 

Into #Temp 

From CTE as C 



Select Distinct 
    T.ID 

From #Temp as T 

Group by T.ID 

Having 
    Sum(Case When T.Keep = 'Y' Then 1 Else 0 End) = 4 
    and 
    Sum(Case When T.Remove = 'Y' then 1 Else 0 End) = 0 

起初,我並沒有考慮到,如果同樣的想法有相同的CID的多個甚至是一個選項。如果這是你應該能夠添加一個獨特的第一個選擇語句,使其仍然工作。

+0

Plus'1'的努力! – smr5

+0

dang相同的概念,但沒有臨時表@vkp在那裏做得很好我沒有想到使用having子句直到我得到臨時表之後。儘管如此 –