如果符合某些条件,我正在尝试从表中返回DISTINCT
个ID。
- ID必须包含1,26,33,49(全部)的CID
- ID不应包含38或46或67
的CID 醇>
这是表格。
这是我到目前为止所拥有的:
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
。
我试图在不使用subquery
的情况下获得此输出。
有什么建议吗?
答案 0 :(得分:3)
使用条件聚合。
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)