排除两个不同列中具有相同值的行

时间:2017-08-25 16:40:27

标签: sql sql-server

我有一个表有2列有时具有相同的值。我想知道如何排除column1的值等于column2中的值的行。

示例:

COL1   |    COL2

1  --------  7  
2  --------  8    
3  --------  2
4  --------  5    
5  --------  9

这里我将排除第2行和第5行。 感谢

5 个答案:

答案 0 :(得分:1)

select 
   * 
from table
where col1 not in (
   select 
       column2 
   from table
)

答案 1 :(得分:1)

这样的事情应该有效:

SELECT * 
FROM yourtable 
WHERE COL1 NOT IN (SELECT COL2 
                   FROM yourtable)

答案 2 :(得分:1)

我倾向于避免使用IN作为长值列表,因为它在某些数据库系统上表现不佳。以下选择col1中不存在于col2中的所有值:

SELECT col1 
FROM
  yourtable t1
  LEFT JOIN
  yourtable t2
  ON 
    t1.col1 = t2.col2
WHERE
  t2.col2 IS NULL

为什么会这样?好吧,通常连接运算符会将具有相同值的行链接在一起。左连接将保留一些不匹配的行(并且它们是我们想要的那些)。左连接采用左侧的表(t1)并将其用作参考表,并开始关联右侧表中的行(在JOIN之后,在本例中为t2)。如果col1值在col2中具有匹配值,则该行将完全填充每个值的值。如果col1中的值与col2没有匹配值,则生成的行上的col2单元格为空/空。因为我们只想知道那些不匹配的值,我们说"其中col2为空"

掌握这一点的另一个技巧是理解同一个表在查询中可以出现两次。我们每次使用它时都会给它一个不同的别名,所以我们可以区分它们。您可以将它设想为在将表格链接在一起之前虚拟制作表格的副本

答案 3 :(得分:0)

EXCEPT与相关的子查询一起使用 - 如下所示。

  

在此处阅读:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-except-and-intersect-transact-sql

SELECT *
FROM TEST

EXCEPT 

SELECT *
FROM TEST
WHERE COL1 IN (
    SELECT COL2
    FROM TEST
)

答案 4 :(得分:-1)

不确定,但也许......

SELECT t1.* 
FROM my_table AS t1
LEFT JOIN my_table AS t2
     ON t2.col_b = t1.col_a
WHERE t2.col_b IS NULL