创建一个表,其中只包含一个表中存在的记录而不存在另一个表中的记录

Posted

技术标签:

【中文标题】创建一个表,其中只包含一个表中存在的记录而不存在另一个表中的记录【英文标题】: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 中的列名重复”

帮助! 谢谢。

【问题讨论】:

您是否尝试过创建表,然后将查询结果添加到其中?这将跳过创建表步骤并依赖插入语法 【参考方案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/…

以上是关于创建一个表,其中只包含一个表中存在的记录而不存在另一个表中的记录的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个表中的值插入和/或更新记录

如果记录存在于另一个表中,则条件格式详细信息行

如何编写一个 MySQL 查询,该查询返回一个临时列,其中包含与该行相关的项目是不是存在于另一个表中的标志

如何在Access中使用子表单时编辑现有记录而不创建新记录?

MySQL 根据记录是不是存在于另一个表中选择布尔值

SQL Server 查询。用户存在于另一个表中但不存在用户的位置