【问题标题】:Creating a table that includes only records that exist in one table without existing in another创建一个表,其中只包含一个表中存在的记录而不存在另一个表中的记录
【发布时间】:2013-12-22 22:10:13
【问题描述】:

我是这里的新手,希望有人可以帮助解决这个 sql。我创建了两个表,其中一个包含每条记录,另一个包含我不想要的记录。 我尝试以我研究过的方式加入他们应该工作,只包括他们不在第二个表中的记录,但我遇到了一个错误。 SQL 是:

Create table t3 as 
(Select * from t1 
 Left Outer join t2 
 on (t1.ID = t2.Orig_ID and t1.ID_Line = t2.Orig_ID_Line) 
 Where t2.Orig_ID is null 
 and t2.Orig_ID_Line is null) 

这应该很简单。但是,我收到一条错误消息,提示“Orig_ID 中的列名重复”

帮助! 谢谢。

【问题讨论】:

  • 您是否尝试过创建表,然后将查询结果添加到其中?这将跳过创建表步骤并依赖插入语法

标签: sql


【解决方案1】:

您的原始陈述非常接近,但忘记将列限制为来自t1 的列,因此您的列数是预期的两倍。试试:

CREATE TABLE t3 AS 
    (SELECT t1.* FROM t1         -- Key change * -> t1.*
       LEFT OUTER JOIN t2 
         ON (t1.ID = t2.Orig_ID AND t1.ID_Line = t2.Orig_ID_Line) 
      WHERE t2.Orig_ID IS NULL 
        AND t2.Orig_ID_Line IS NULL)

【讨论】:

    【解决方案2】:

    试试这个

    Create table t3 as 
    
    select * from t1 where (t1.ID, t1.ID_Line) not in ( select t2.ID, t2.Orig_ID_Line from t2 where t2.ID is not null and t2.Orig_ID_Line is not null )
    

    您收到重复列名错误,因为您在两个表中加入并选择了两个字段。因此,从查询返回的列名相同,并且表不能具有相同的列名。您需要的是仅在 t1 表中选择列

    select t1.* ......
    

    但是你不需要join操作。你需要的很简单。您需要使用“不在”运算符。查看 in/not in 运算符的 sql 教程。

    【讨论】:

    • 没有解决 ID_Line 问题。会是这样: select * from t1 where (t1.ID is not in (select t2.ID from t2 where t2.ID is not null ) 和 (t1.ID_Line is not in (select t2.Orig_ID_Line from t2 where t2 .Orig_ID_Line 不为空))
    • 您使用什么平台?甲骨文?我相应地编辑了我的答案。再看看。
    • 嗯,Mysql 支持使用 not in 操作符进行多列比较。所以答案应该有效
    • 为什么我不说在哪里(t2.ClaimID 不为空且 t2.Claim_Line 不为空)?
    • 关于 sql 的事情是;如果将任何空值与非空值进行比较,则根本不会得到任何结果。因为 null 不能与非 null 值进行比较。所以不会返回任何值。这就是为什么您不能使用“=”运算符进行空比较,并且存在“is null”和“is not null”子句。在以下链接中了解更多信息:techrepublic.com/article/…
    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多