【问题标题】:SQL 'NOT IN' Operator doesn't give expected results when comparing columns in two tables比较两个表中的列时,SQL 'NOT IN' 运算符未给出预期结果
【发布时间】:2014-11-01 01:06:23
【问题描述】:

我需要从一个临时表更新一个表。因此,我需要比较并找出哪些行不在要从临时表导入的主表中。 我的表格如下所示,

line_id -> nvarchar(20)
order_no -> nvarchar(20)
line_no ->int

两个表具有相同的字段,但临时表有更多最新记录要带到主表中。我正在使用;

INSERT INTO main_table
  SELECT * FROM temp_table t 
  WHERE t.line_id NOT IN (SELECT line_id FROM main_table)

但条件WHERE t.line_id NOT IN (SELECT line_id FROM main_table) 不会带来任何订单行。 但是当使用order_no 而不是line_id 时,比较就完成了,并且开始出现数字或顺序行。但order_no 不是唯一键,并且该比较不会返回所需的所有行。

如果您能帮助我,那就太好了.. 提前致谢!

【问题讨论】:

  • 临时表中是否有不在主表中的 line_id - 请注意,插入仅添加行而不能更新任何内容
  • 是的。两个表中都没有主键(不是一个好习惯),但是一个不可索引的列返回结果,而其他列都没有!
  • Mark - 是的,temp 中有超过 1000 行不在 main 中。我使用“更新”这个词的字面意思,而不是技术意义..对此感到抱歉:P
  • 如果任何 line_id 为空,Not in 将不起作用 - 而 select 1 where 1 not in (2) 起作用,select 1 where 1 not in (2, null) 不起作用。

标签: sql sql-server database


【解决方案1】:

Not-in 会带来奇怪的麻烦。这是对同一想法的不同看法。

Insert Into main_table
  select t.* 
    from temp_table t
    left outer join main_Table m
      on t.line_id=m.line_id
   where m.line_id is null

【讨论】:

  • 太棒了!很高兴我能帮助你!祝福!
【解决方案2】:

尝试以下方法:

INSERT INTO main_table
  SELECT * FROM temp_table t 
  WHERE LTRIM(RTRIMt.line_id)) NOT IN (SELECT LTRIM(RTRIM(line_id)) FROM main_table)

【讨论】:

  • 我试过了,但没有成功!我很困惑,无法解释发生了什么。
猜你喜欢
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
相关资源
最近更新 更多