复杂的SQL查询:同一个表中的两个查询?

时间:2012-03-28 12:59:30

标签: mysql sql

我有一张表:

ID  |     LABEL     |   SOME_VALUE
1           a              rand_1
2           a              NULL
3           b              rand_9
4           c              rand_3
5           c              rand_3
6           c              rand_3
7           d              NULL
8           d              rand_4

如您所见,ID是唯一的,标签不是唯一的(可以是1或更多),some_value也不是唯一的。

我想做的是以下内容:

我想获得一个唯一的LABELS列表,它在数据库中存在多行(最少2行),其中行的SOME_VALUE不是NULL。

所以我会得到:

ID  |     LABEL     |   SOME_VALUE
1           a            rand_1
2           a            NULL
7           d            NULL
8           d            rand_4

作为回报。

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:2)

HAVING参数限制分组项目:

SELECT 
    Label
FROM dbo.TableName
WHERE NOT Some_Value IS NULL
GROUP BY Label
HAVING COUNT(*) > 2

答案 1 :(得分:2)

有两个版本。第一个与结果中列出的完全一致,消除了rand_3,因为即使它出现三次,所有值都是相同的(我没有看到相关指定的明确条件)。

必须有一个更好的方法,但正如他们所说我今天无法大脑,我有愚蠢的: - )

select * 
from tbl
inner join
(
  select label
  FROM tbl
  GROUP BY Label
  HAVING count (distinct some_value) 
       + sum(distinct case when some_value is null then 1 else 0 end) > 1
) a
on tbl.label = a.label

第二个也按照要求检索C(对于some_value中的至少一个,some_value不为null)。

select * 
from tbl
inner join
(
  select label
  FROM tbl
  GROUP BY Label
  HAVING count(*) > 1 and count(some_value) > 0
) a
on tbl.label = a.label

And there is Sql Fiddle

答案 2 :(得分:1)

SELECT t1.* 
FROM yourTable t1
JOIN yourTable t2
ON t1.LABEL = t2.LABEL
AND t1.ID < t2.ID
WHERE t1.SOME_VALUE IS NOT NULL
OR t2.SOME_VALUE IS NOT NULL

答案 3 :(得分:1)

这应该有效 -

SELECT test.*
FROM (
    SELECT label
    FROM test
    GROUP BY Label
    HAVING COUNT(DISTINCT IFNULL(some_value, '~null~')) > 1
) AS tmp
INNER JOIN test
    ON tmp.label = test.label;