SQL - 将一列与某列进行比较以找到匹配值
SQL - Compare one column to some column to find match value
我有一些数据集,我会将其与自连接进行比较
问题是,我想将 A 列与 B、C 和 D 列进行比较。
如果 A 列与所有三列都不匹配,那么我会将其插入到 table.
否则,如果 A 列与 B、C 或 D 列中的至少一列具有匹配值,那么我将不会插入该值。
这是我的示例数据
ID ColA ColB ColC ColD
1 ORANGE RED BLUE GREEN
2 RED YELLOW RED PURPLE
这是我的预期结果。由于ID 1
没有匹配值,那么会插入,而ID 2
不会插入
ID ColA ColB ColC ColD
1 ORANGE RED BLUE GREEN
我尝试了 LEFT JOIN
但 ID 2 仍在结果中
select a.*
from TableA a
left join TableA b
on a.ID = b.ID
where 1=1
and (a.ColA <> b.ColB
OR a.ColA <> b.ColC
OR a.ColA <> b.ColD)
有什么想念的吗?
谢谢
更新
感谢@Dale K 帮助我,现在我添加一些关于我们评论的数据集。
如果 ColB、ColC 或 ColD 上有 NULL
个值
如何使用以下数据获得预期结果
ID ColA ColB ColC ColD
3 YELLOW NULL YELLOW RED
4 RED NULL NULL RED
5 GREEN NULL BLUE RED
因为只有ID 5与ColA没有匹配值,这里是预期结果
ID ColA ColB ColC ColD
5 GREEN NULL BLUE RED
谢谢
应该是
select *
from TableA
where (ColA <> ColB
AND ColA <> ColC
AND ColA <> ColD)
您甚至不需要连接,您想要 AND
而不是 OR
即您希望所有条件都为真,而不仅仅是其中一个。
假设 ColA 永远不会为空或空白给出
select a.*
from TableA
where ColA <> coalesce(ColB,'') and ColA <> coalesce(ColC,'') and ColA <> coalesce(ColD,'');
然而,如果 ColB & ColC & ColD 都为空,这将匹配。
如果你想正确处理空值(null 等于 null 但不是空白 ''
)那么你需要以下内容
SELECT a.*
FROM TableA a
WHERE NOT EXISTS (
SELECT a.ColA
INTERSECT (
SELECT a.ColB
UNION ALL
SELECT a.ColC
UNION ALL
SELECT a.ColD
)
);
我有一些数据集,我会将其与自连接进行比较
问题是,我想将 A 列与 B、C 和 D 列进行比较。 如果 A 列与所有三列都不匹配,那么我会将其插入到 table.
否则,如果 A 列与 B、C 或 D 列中的至少一列具有匹配值,那么我将不会插入该值。
这是我的示例数据
ID ColA ColB ColC ColD
1 ORANGE RED BLUE GREEN
2 RED YELLOW RED PURPLE
这是我的预期结果。由于ID 1
没有匹配值,那么会插入,而ID 2
不会插入
ID ColA ColB ColC ColD
1 ORANGE RED BLUE GREEN
我尝试了 LEFT JOIN
但 ID 2 仍在结果中
select a.*
from TableA a
left join TableA b
on a.ID = b.ID
where 1=1
and (a.ColA <> b.ColB
OR a.ColA <> b.ColC
OR a.ColA <> b.ColD)
有什么想念的吗?
谢谢
更新
感谢@Dale K 帮助我,现在我添加一些关于我们评论的数据集。
如果 ColB、ColC 或 ColD 上有 NULL
个值
如何使用以下数据获得预期结果
ID ColA ColB ColC ColD
3 YELLOW NULL YELLOW RED
4 RED NULL NULL RED
5 GREEN NULL BLUE RED
因为只有ID 5与ColA没有匹配值,这里是预期结果
ID ColA ColB ColC ColD
5 GREEN NULL BLUE RED
谢谢
应该是
select *
from TableA
where (ColA <> ColB
AND ColA <> ColC
AND ColA <> ColD)
您甚至不需要连接,您想要 AND
而不是 OR
即您希望所有条件都为真,而不仅仅是其中一个。
假设 ColA 永远不会为空或空白给出
select a.*
from TableA
where ColA <> coalesce(ColB,'') and ColA <> coalesce(ColC,'') and ColA <> coalesce(ColD,'');
然而,如果 ColB & ColC & ColD 都为空,这将匹配。
如果你想正确处理空值(null 等于 null 但不是空白 ''
)那么你需要以下内容
SELECT a.*
FROM TableA a
WHERE NOT EXISTS (
SELECT a.ColA
INTERSECT (
SELECT a.ColB
UNION ALL
SELECT a.ColC
UNION ALL
SELECT a.ColD
)
);