2015-07-10 47 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' 
相关问题