我试图编写一个查询以选择两列之间具有唯一关系的所有行。
例如:
1 2 3 4
-------------
a t g 1
a f d 1
b h l 2
b r g 2
b q m 3
在这里,我只看第1列和第4列。
在此表中,我想选择第1行和第2行,因为在这两个行中,第1列= a和第4列=1。换句话说,每次在第1列中出现a时,在第4列中出现1。我不想为列1选择任何包含b的行,因为列4的那些对应值可以是2或3。
答案 0 :(得分:1)
通过此查询,您可以轻松获得满足您要求的第1列值:
SELECT col1
FROM mytable
GROUP BY col1
HAVING COUNT(DISTINCT col4) = 1
因此,您的最终查询将是:
SELECT *
FROM mytable
WHERE col1 IN
(
SELECT col1
FROM mytable
GROUP BY col1
HAVING COUNT(DISTINCT col4) = 1
)
答案 1 :(得分:0)
我想这就是您想要的:
select *
from my_table
where "1" in (
select c1
from (
select "1" as c1, count("4") as cnt
from my_table
group by "1" -- fixed here.
having count("4") > 1
) x
group by c1
having count(cnt) = 1 -- this is the key condition.
)
考虑到列名不是以字母开头,如果像我一样用双引号("
括起来,那么大多数数据库都会接受它们。
答案 2 :(得分:0)
要选择实际的行,然后使用not exists
:
select t.*
from t
where not exists (select 1 from t t2 where t2.c1 = t.c1 and t2.c4 <> t.c4);
如果只想使用c1
值,则按照其他答案的建议使用group by
。