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
  )
);