示例1
+--------------------------+
| IDENT | CURRENT | SOURCE |
+--------------------------+
| 12345 | 12345 | A |
| 23456 | 12345 | B |
| 34567 | 12345 | C |
+--------------------------+
示例2
+--------------------------+
| IDENT | CURRENT | SOURCE |
+--------------------------+
| 12345 | 55555 | A |
| 23456 | 55555 | B |
+--------------------------+
尝试编写选择查询,该查询将显示CURRENT count = 2且SOURCE包含A和B(NOT C)的所有记录。
由于记录与SOURCE C相关联,因此当前A不应出现,因为CURRENT有3个条目。
示例B是我要查找的查询,CURRENT有两条记录,只链接到SOURCE'A'和'B'。
目前,如果我运行类似于“SOURCE = A或SOURCE = B”的内容,则结果是仅具有A或OR + C的SOURCE的记录。 注意:IDENT始终是一个独特的价值。 CURRENT链接来自不同SOURCE的多个IDENT。
答案 0 :(得分:1)
我们显然缺少更多信息。让我们来看一些示例数据(感谢最初的小提琴令人沮丧)。
| ID | CURRENT | SOURCE |
|----|---------|--------|
| 1 | 111 | A |
| 2 | 111 | B |
| 3 | 111 | C |
| 4 | 222 | A |
| 5 | 222 | B |
| 6 | 333 | A |
| 7 | 333 | C |
| 8 | 444 | B |
| 9 | 444 | C |
| 10 | 555 | B |
| 11 | 666 | A |
| 12 | 666 | A |
| 13 | 666 | B |
| 14 | 777 | A |
| 15 | 777 | A |
我假设你只需要这个结果:
| ID | CURRENT | SOURCE |
|----|---------|--------|
| 4 | 222 | A |
| 5 | 222 | B |
此查询将适用于任意数量的源并产生预期的输出:
SELECT * FROM test
WHERE CURRENT IN (
SELECT CURRENT FROM test
WHERE CURRENT NOT IN (
SELECT CURRENT FROM test
WHERE SOURCE NOT IN ('A', 'B')
)
GROUP BY CURRENT
HAVING count(SOURCE) = 2 AND count(DISTINCT SOURCE) = 2
)
答案 1 :(得分:0)
记录当前计数= 2:
SELECT CURRENT
FROM table
GROUP BY CURRENT
HAVING COUNT(*) = 2
记录C在SOURCE值中的位置:
SELECT CURRENT
FROM table
WHERE SOURCE = 'C'
全局查询:
SELECT t.*
FROM TABLE t
WHERE t.CURRENT IN (
SELECT CURRENT
FROM table
GROUP BY CURRENT
HAVING COUNT(*) = 2
) AND t.CURRENT NOT IN (
SELECT CURRENT
FROM table
WHERE SOURCE = 'C'
)
答案 2 :(得分:0)
http://sqlfiddle.com/#!2/69be9/8/0
select * from test where current in (
select test_a.current
from
(select *
from test
where source = 'A') as test_a
join (select *
from test
where source = 'B') as test_b
on test_b.current = test_a.current
where test_a.current not in
(select current from test where source='C')
)
答案 3 :(得分:0)
SELECT *
FROM TABLE mainTbl,
(SELECT CURRENT
FROM TABLE
WHERE source IN ('A', 'B')
HAVING COUNT(1) = 2
GROUP BY CURRENT
) selectedSet
WHERE mainTbl.current = selectedSet.current
AND mainTbl.source IN ('A', 'B');
答案 4 :(得分:0)
如果SOURCE
值保证每CURRENT
个唯一:
SELECT CURRENT
FROM atable
GROUP BY CURRENT
HAVING COUNT(SOURCE) = 2
AND COUNT(CASE WHEN SOURCE IN ('A', 'B') THEN SOURCE END) = 2
;
如果SOURCE
值对于CURRENT
不唯一,但允许CURRENT
或'A'
重复的'B'
个{/ 1}}:
SELECT CURRENT
FROM atable
GROUP BY CURRENT
HAVING COUNT(DISTINCT SOURCE) = 2
AND COUNT(DISTINCT CASE WHEN SOURCE IN ('A', 'B') THEN SOURCE END) = 2
;
如果SOURCE
值不唯一且不允许具有重复SOURCE
条目的组:
SELECT CURRENT
FROM atable
GROUP BY CURRENT
HAVING COUNT(SOURCE) = 2
AND COUNT(DISTINCT SOURCE) = 2
AND COUNT(DISTINCT CASE WHEN SOURCE IN ('A', 'B') THEN SOURCE END) = 2
;
每个查询仅返回与要求匹配的不同CURRENT
值。将查询用作派生数据集并将其连接回表格以获取详细信息。
以上所有选项都假定SOURCE
是NOT NULL
列,或者只能忽略NULL。