Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 排除两个不同列中具有相同值的行_Sql_Sql Server - Fatal编程技术网

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

Sql 排除两个不同列中具有相同值的行,sql,sql-server,Sql,Sql Server,我有一个表,它有两列,有时有相同的值。我想知道如何排除column1的值等于column2中的值的行 例如: COL1 | COL2 1 -------- 7 2 -------- 8 3 -------- 2 4 -------- 5 5 -------- 9 这里我将排除第2行和第5行。 谢谢使用除了和相关子查询-如下所示 请仔细阅读以下内容: 不确定,但也许 SELECT t1.* FROM my_table AS t1 LEFT J

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

例如:

COL1   |    COL2

1  --------  7  
2  --------  8    
3  --------  2
4  --------  5    
5  --------  9
这里我将排除第2行和第5行。
谢谢

使用
除了
和相关子查询-如下所示

请仔细阅读以下内容:

不确定,但也许

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

像这样的方法应该会奏效:

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

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

SELECT col1 
FROM
  yourtable t1
  LEFT JOIN
  yourtable t2
  ON 
    t1.col1 = t2.col2
WHERE
  t2.col2 IS NULL
它为什么有效?通常,join操作符将具有相同值的行链接在一起。左连接将保留一些不匹配的行(这是我们想要的)。left join将左侧的表(t1)用作引用表,并开始关联右侧表中的行(在join一词之后,在本例中为t2)。如果col1值在col2中具有匹配的值,则该行将完全填充每个值的值。如果col1中的值与col2中的值不匹配,则结果行上的col2单元格为空/null。因为我们只想知道那些不匹配的值,所以我们说“where col2 is null”


另一个技巧是理解同一个表在查询中可能出现两次。我们每次使用它时都会给它一个不同的别名,这样我们就可以区分它们了。您可以设想它实际上是在将表链接到一起之前复制一份表

欢迎使用。在有代码的每行开始处放置4个空格。我赞成在中使用此方法。如果表中的列数超过2列,但仍要排除column1等于column2中某个值的行,该怎么办?where子句仅比较col1和col2,这样就不会影响表中有多少列。这是有争议的,因为left join匹配并选择所有行和列然后过滤。不是从一开始就过滤每一行。一个执行计划将显示哪一个最适合db。简短而甜蜜!我要添加的唯一一件事是,如果您的表中还没有列,则为每列添加单独的索引。@goose优化者很有可能会选择一个完整的表扫描,然后是一个散列(基本上是动态构建索引),因此索引可能会被忽略。当然,这同样适用于基于IN的查询;不同的乐观主义者以不同的方式规划这些事情。在我过去的经验中,甲骨文的加入比加入更糟糕。Sqlserver似乎更好;也许MS在识别和重写查询方面花了更多的精力,使它们在IN或JOiN中都是等效的,尽管我一直认为“不要在列表中使用超过手动键入长度的内容”是一条很好的经验法则,理论上,IN应该比不在IN中工作得更好;然而,我也使用了EXCEPT,它可能会超过我通过避免不在而获得的任何收益。我还没有用一个大数据集测试过这一点(比如在100万行的北部),它们是否得到了相同的执行计划?若是这样的话,就用NOT IN,因为它更小,更短,更容易阅读。在两种方法之间没有性能增益的情况下,最好使用易于阅读的版本。
SELECT * 
FROM yourtable 
WHERE COL1 NOT IN (SELECT COL2 
                   FROM yourtable)
SELECT col1 
FROM
  yourtable t1
  LEFT JOIN
  yourtable t2
  ON 
    t1.col1 = t2.col2
WHERE
  t2.col2 IS NULL