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子句。