Sql 仅选择不包含重复值的行
上下文 我有一个表,它有一个类似键值的列。同一个键值可以出现在多行中,我只想选择包含不出现在多行中的键的行。例如,如果输入表为:Sql 仅选择不包含重复值的行,sql,Sql,上下文 我有一个表,它有一个类似键值的列。同一个键值可以出现在多行中,我只想选择包含不出现在多行中的键的行。例如,如果输入表为: key | col1 | col2 | other columns _______________________________________ 1 1337 1338 1 1339 1340 2 1341 1342 3 1343 1344 3 1345
key | col1 | col2 | other columns
_______________________________________
1 1337 1338
1 1339 1340
2 1341 1342
3 1343 1344
3 1345 1346
4 1347 1348
5 1349 1350
5 1351 1352
5 1353 1354
输出应为:
key | col1 | col2 | other columns
_______________________________________
2 1341 1342
4 1347 1348
问题:
我可以在不填充第三个表的情况下高效地执行此操作吗
我试过的
但是,这不是一个有效的查询。如果col1为NULL呢?我仍然需要行键col2和其他列
SELECT key, col1, col2, other columns
FROM input_t
GROUP BY key
HAVING COUNT(col1) = 1
也不是有效的查询
我尝试过使用DISTINCT,但这不会忽略多次出现的键。对我来说,聚合其他列也没有逻辑意义。只要在键从不为NULL的情况下使用not IN即可
SELECT key, col1, col2, other columns
FROM input_t
GROUP BY key
HAVING COUNT(col1) = 1
如果密钥从不为空,只需使用NOT IN
如果愿意,可以使用聚合:
SELECT key, min(col1) as col1, min(col2) as col2, . . .
FROM input_t
GROUP BY key
HAVING COUNT(col1) = 1;
只有一行时,min是值
为了提高效率,最好的方法可能是:
select t.*
from input_t t
where not exists (select 1
from input_t t2
where t2.key = t.key and t2.col1 <> t.col1
);
这假设col1对于每个键都是唯一的,就像您的数据一样
这可以利用输入键col1上的索引。如果愿意,可以使用聚合:
SELECT key, min(col1) as col1, min(col2) as col2, . . .
FROM input_t
GROUP BY key
HAVING COUNT(col1) = 1;
只有一行时,min是值
为了提高效率,最好的方法可能是:
select t.*
from input_t t
where not exists (select 1
from input_t t2
where t2.key = t.key and t2.col1 <> t.col1
);
这假设col1对于每个键都是唯一的,就像您的数据一样
这可以利用输入键col1上的索引。两种方法如何
SELECT *
FROM input_t
WHERE key IN (
SELECT key
FROM input_t
GROUP BY key
HAVING COUNT(key) = 1)
或
两个都可以吗
SELECT *
FROM input_t
WHERE key IN (
SELECT key
FROM input_t
GROUP BY key
HAVING COUNT(key) = 1)
或
您是否有某种唯一的id列?另外,您使用的是哪种SQL方言?SQL Server?很抱歉没有指定,我正在高度修改的工作环境中使用Presto。您是否有某种唯一的id列?另外,您使用的是哪种SQL方言?SQL Server?很抱歉没有指定,我正在一个高度修改的工作环境中使用Presto。这与我尝试的第一个场景类似,如果col1为NULL会怎么样?我仍然需要key、col2和其他列。@PhotometricStereo。第一个有效。第二个版本需要一个空安全比较,这取决于数据库。@GordonLinoff我认为他的部分问题是他在WHERE子句而不是HAVING子句中限制了聚合函数。这与我尝试的第一个场景类似,如果col1为空怎么办?我仍然需要key、col2和其他列。@PhotometricStereo。第一个有效。第二个版本需要一个空安全比较,这取决于数据库。@GordonLinoff我认为他的部分问题在于他在WHERE子句中使用了聚合函数,而不是HAVING子句。