2015-07-10 62 views
2

如果標題不完全準確,但我不確定如何正確說出我的問題,表示抱歉。我只想返回結果包括在特定列上分組的IN語句中的所有項的行。所以我的查詢是:在SQL中返回記錄,其中包含來自IN子句的所有值

SELECT [DRSY], 
      [DRRT], 
      [DRKY], 
      [DRDL01] 
     FROM dbo.f0005 
    WHERE DRKY IN ('FC', 'OO', 'SH') 

我想返回記錄,其中DRSY和DRRT包括所有項目「FC」,「OO」,「SH」的。也許一個圖片將有助於說明這一點:

Results where DRSY = 00 and DRRT = DT

我想返回的行都是其中DRSY = '00'和DRRT =「DT」,因爲這包括我指定的所有3個值。我試圖尋找使用IN,EXISTS甚至ALL的不同方法。

+0

你能不能在WHERE子句中指定它們? WHERE DRSY ='00'和DRRT ='DT' –

+0

您正在使用哪些DBMS? –

+0

訂單是否重要,是第一個值總是「DRSY」和第二個「DRRT」等? –

回答

3

我相信這可以通過分組,然後確保重複計數做等於搜索項目的數量:

SELECT [DRSY], 
      [DRRT] 
    FROM dbo.f0005 
    WHERE DRKY IN ('FC', 'OO', 'SH') 
    GROUP BY [DRSY], [DRRT] 
    HAVING COUNT(DISTINCT DRKY) = 3; 

編輯,再確保項目的計數保持同步

你可以做的是建立一個派生表或CTE,其中包含期望值列表(searchValues),然後你可以加入(而不是IN),然後你將能夠COUNTsearchValues avodi任何維護問題與計數值。

WITH searchValues AS 
(
    select val 
    from (values ('FC'), ('OO'), ('SH')) as s(val) 
) 
SELECT [DRSY], 
     [DRRT] 
    FROM dbo.f0005 
    INNER JOIN searchValues s 
    ON DRKY = s.val 
    GROUP BY [DRSY], [DRRT] 
    HAVING COUNT(DISTINCT DRKY) = (SELECT COUNT(val) FROM searchValues); 

SqlFiddle here

+0

這很好 - 如果我向IN子句中添加另一個值,我只需要增加having子句中的數字。謝謝! –

+0

@AndrewCorson實際上,你可以做的是建立一個表,cte或包含'搜索'值的派生表,這樣可以提高查詢的可維護性 - 我已經更新。 – StuartLC

+1

感謝您的幫助。我會試試這個。 –

1

SELECT DRSY, DRRT, DRKY, DRDL01 FROM dbo.f0005 a 
WHERE exists (
    SELECT * FROM dbo.f005 b WHERE DRKY = "FC" and a.DRSY = b.DRSY and a.DRRT = b.DRRT 
) 
AND exists (
    SELECT * FROM dbo.f005 c WHERE DRKY = "00" and a.DRSY = c.DRSY and a.DRRT = c.DRRT 
) 
AND exists (
    SELECT * FROM dbo.f005 d WHERE DRKY = "SH" and a.DRSY = d.DRSY and a.DRRT = d.DRRT 
) 
+0

這沒有奏效。 –

0

我把什麼@ StuartLC的例子,改變了它一下。這樣我就可以包含表格中的其他列。再次感謝Stuart!

WITH drky_count 
    AS (SELECT DR.DRSY, 
       DR.DRRT, 
       DR.DRKY, 
       DR.DRDL01, 
       COUNT (DR.DRKY) OVER (PARTITION BY DR.DRSY, DR.DRRT) 
        AS DRKY_COUNT 
      FROM f0005 DR 
     WHERE DR.DRKY IN ('FC', 'OO', 'SH')) 
    SELECT DRSY, DRRT, DRKY, DRDL01 
     FROM drky_count 
    WHERE DRKY_COUNT = (SELECT MAX (DRKY_COUNT) FROM drky_count) 
0

你也可以做到這一點與intersect

SELECT [DRSY], [DRRT] FROM dbo.f0005 WHERE DRKY = 'FC' 
INTERSECT 
SELECT [DRSY], [DRRT] FROM dbo.f0005 WHERE DRKY = 'OO' 
INTERSECT 
SELECT [DRSY], [DRRT] FROM dbo.f0005 WHERE DRKY = 'SH' 
相關問題