从子查询接收的值列表中选择,可能为null

用户名

(我的简化版本)查询如下所示:

SELECT id
FROM table
WHERE column1
IN
(
    SELECT column1
    FROM table
    GROUP BY column1
    HAVING COUNT(*) > 1
)

这将选择一个id的列表,其中column1具有多个出现的值(换句话说,它们不是唯一的)。这可以按预期工作,但有一个例外:如果多次出现NULL值(这是可能的),则不会选择任何ID。万一NULL是非唯一的,选择列ID的正确方法是什么?

野生撒尿

使用EXISTS代替IN:存在更清晰(IMHO),并且在大多数情况下,它也更快。IN (...)需要删除/删除重复项和NULL,因此:对集合进行排序)

在这种特殊情况下:仅需要聚合子查询来找出group count() > 1查询优化器可能没有意识到这一点,并在将它们与进行比较之前计算了完整的组计数(在完整的行集合中)1

SELECT tt.id
FROM thetable tt
WHERE EXISTS (
    SELECT * FROM thetable ex
    WHERE ex.column1 = tt.column1 AND ex.id <> tt.id
);

WRT对NULL的抑制:WHERE ex.column1 = tt.column1如果一个ex.column1tt.column1(或两者)碰巧为NULL,子句将始终产生false


更新。看来,OP也想要带有的元组column1 IS NULL(如果有更多的元组)简单的解决方案是使用前哨值(不是本地存在的值columnn1)并将其用作替代值:(在下面的片段中-1用作替代值)

SELECT tt.id
FROM thetable tt
WHERE EXISTS (
    SELECT * FROM thetable ex
    WHERE COALESCE(ex.column1, -1) = COALESCE(tt.column1, -1)
    AND ex.id <> tt.id
);

另一种(显而易见的)方法是显式检查NULL,但这将需要一个OR子句和一堆括号,例如:

SELECT tt.id
FROM thetable tt
WHERE EXISTS (
    SELECT * FROM thetable ex
    WHERE (ex.column1 = tt.column1 
          OR (ex.column1 IS NULL AND tt.column1 IS NULL)
          )
    AND ex.id <> tt.id
);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MYSQL从子查询中选择列表中的项目

来自分类Dev

从子查询中选择SQL

来自分类Dev

从子查询中选择列

来自分类Dev

选择具有可能为NULL值的HQL

来自分类Dev

QueryOver:从子查询中选择列

来自分类Dev

useState的值可能为null

来自分类Dev

如何从可能为布尔值或字符串“ 1”的列中选择?

来自分类Dev

如何从子查询中选择具有MAX值的整个元组?

来自分类Dev

如何从子查询中选择具有MAX值的整个元组?

来自分类Dev

从列表中选择值

来自分类Dev

MongoDB在查询列表中选择所有where字段值

来自分类Dev

进行SQL查询以从多个列中选择值列表

来自分类Dev

MongoDB在查询列表中选择所有where字段值

来自分类Dev

从子查询中选择,在条件引发错误的地方选择

来自分类Dev

Laravel查询生成器从子查询中选择

来自分类Dev

在SQL查询中选择实际的MIN值而不是NULL

来自分类Dev

SQL Multiple NOT LIKE,可能为NULL值

来自分类Dev

DataSnapshot值是否有可能为null?

来自分类Dev

如何使用Django ORM从子查询中选择?

来自分类Dev

T-SQL从子查询中选择MAX

来自分类Dev

MySQL从子查询中选择不起作用

来自分类Dev

使用 CriteriaBuilder 从子查询中的路径中选择?

来自分类Dev

yii2在查询中选择NULL值(选择NULL作为列,...)

来自分类Dev

MySQL:从值列表中选择

来自分类Dev

读者仅从MySQL数据库中选择空字段-错误消息:该值不能为NULL参数:项目

来自分类Dev

PowerShell - 从子数组的列中选择单个值

来自分类Dev

从子列表中选择最小值,然后在该子列表中显示最小值的另一个值

来自分类Dev

选择从子查询到主查询的最小日期值

来自分类Dev

EF Core Linq查询以从可能性列表中选择匹配的行

Related 相关文章

热门标签

归档