根据几个标准返回不同的ID

时间:2016-04-06 22:33:36

标签: sql sql-server-2012

如果符合某些条件,我正在尝试从表中返回DISTINCT个ID。

  
      
  1. ID必须包含1,26,33,49(全部)的CID
  2.   
  3. ID不应包含38或46或67
  4. 的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 = 38

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

这不会返回正确的ID。另外,如果我为c1.CID添加条件以包含ID 1,26,33,49它也会返回错误的ID。

根据此示例表,我应该只返回ID 12345

这是SQLFIDDLE.

我试图在不使用subquery的情况下获得此输出。

有什么建议吗?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

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

P.S。 ' 4'是强制ID的数量。如果更改参数数量 - 应该相应更新HAVING COUNT子句。

答案 2 :(得分:1)

除了以某种方式说明与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) 

答案 3 :(得分:1)

如果你愿意使用临时表,这是有效的。这是SQL小提琴: http://sqlfiddle.com/#!6/9c862/39/0

$ sed -e 's/ \([^ ][^ ]*\)$/,\1/' /etc/hosts

起初我没有考虑到同一个想法是否有多个相同的CID甚至是一个选项。如果是这样,您应该能够在第一个select语句中添加一个distinct,以使其仍然有用。

答案 4 :(得分:0)

为什么你没有做过像这样的事情?

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

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