Sql 排除两个不同列中具有相同值的行
我有一个表,它有两列,有时有相同的值。我想知道如何排除column1的值等于column2中的值的行 例如: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
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