选择查询,其中记录计数= 2,列包含两个值

时间:2013-10-15 18:23:08

标签: sql count having

示例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。

5 个答案:

答案 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)

  1. 如果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
    ;
    
  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
    ;
    
  3. 如果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
    ;
    
  4. 每个查询仅返回与要求匹配的不同CURRENT值。将查询用作派生数据集并将其连接回表格以获取详细信息。

    以上所有选项都假定SOURCENOT NULL列,或者只能忽略NULL。