SQL Join 2个表,返回只存在1个值而没有其他值的记录

Posted

技术标签:

【中文标题】SQL Join 2个表,返回只存在1个值而没有其他值的记录【英文标题】:SQL Join 2 tables, return records where only 1 value exists and no other values 【发布时间】:2014-04-08 16:44:56 【问题描述】:

我遇到了返回数据记录的问题。我首先想在为 2 个表连接的列中找到某个值存在“0000”的记录。下面是我的 T-SQL;

    SELECT ColumnA, ColumnB, ColumnC
            FROM Table1, Table2
            WHERE  Table1.ColumnB. = Table2.ColumnB
            and ColumnC='0000'

这将返回所需的数据记录,其中“0000”在所有返回的记录中至少存在一次。

我的问题是,我该怎么做,只返回 Distinct 记录,其中 '0000' 是唯一存在的值(一次或多次),并且返回的数据记录不存在其他值

非常感谢!

【问题讨论】:

【参考方案1】:
SELECT distinct ColumnA, ColumnB
           FROM Table1, Table2
          WHERE Table1.ColumnB = Table2.ColumnB
            and ColumnC = '0000'
except 
SELECT distinct ColumnA, ColumnB
           FROM Table1, Table2
          WHERE Table1.ColumnB = Table2.ColumnB
            and ColumnC <> '0000'

如果你想使用连接 猜测ColumnC在Table2中

SELECT distinct Table1.ColumnA, Table1.ColumnB, Table2.ColumnC
           FROM Table1
           JOIN Table2
             on Table1.ColumnB = Table2.ColumnB
            and Table2.ColumnC = '0000'
           left join Table2 exclude 
             on Table1.ColumnB = exclude.ColumnB
            and exclude.ColumnC <> '0000'
          where exclude.ColumnB is null

这可能是表现最好的

SELECT distinct Table1.ColumnA, Table1.ColumnB, Table2.ColumnC
           FROM Table1
           JOIN Table2
             on Table1.ColumnB = Table2.ColumnB
            and Table2.ColumnC = '0000'
            and not exists (select * from table2 exclude  
                             where exclude.ColumnB = Table1.ColumnB 
                               and exclude.ColumnC <> '0000')

【讨论】:

你是否也要给出NOT INNOT EXISTS 的解决方案? @ConradFrix 我想​​到了不存在。它可能是最好的表演者。我不确定您是否可以在不加入排除的情况下逃脱? 谢谢,布拉姆!仅供参考,第一个查询似乎没有排除 t2.columnc 可以是“0000”以外的其他内容我有一个到多个记录,其中我可能将“0000”作为与返回记录匹配但相同的相关父级的值记录不能返回和计算除“0000”以外的任何值。第一个查询返回 96772 条记录,其他 2 个查询相互匹配相同的记录计数 (57263),并且与 Conrad Frix 提供的查询匹配。非常感谢两位如此慷慨地快速提供解决方案!我应该将其中一个或两个都归功于答案吗? 你确定吗?这就是 except 语句的作用。 正确,但是带有 except 的查询 1 返回更多记录,这是因为查询不限于仅包含值“0000”的那些记录。它还为 Table2.columnC 提供确实具有“0000”和在某些情况下具有其他值的记录。 Table1.columnB 是一个唯一的PK 值,也匹配Table2.ColmnB 中的值,但是这个记录有多对一的关系和匹配记录(Table2.ColumnC)。我想要只包含“0000”值的记录,这些记录汇总到 table1.columnB 的 ID,而 Table2.ColumnC 中没有其他可能的值。【参考方案2】:

这是使用 ALL 关键字的解决方案

SELECT DISTINCT
       columna, 
       columnb, 
       columnc 
FROM   table1 t1 
       INNER JOIN table2 t2 
               ON table1.columnb = table2.columnb 
WHERE  t2.columnc = '0000' 
       AND t2.columnc = ALL (SELECT columnc 
                             FROM   table2 t2Check 
                             WHERE  t2.columnb = t2Check.columb) 

这是一个Example,我只使用一个表,因为您的问题中的连接实际上并不重要。

【讨论】:

+1 你能弄清楚为什么我的回答中的期望不起作用(根据 OP) 我的猜测是 OP 在选择子句中包含 COLUMNC

以上是关于SQL Join 2个表,返回只存在1个值而没有其他值的记录的主要内容,如果未能解决你的问题,请参考以下文章

NNER JOIN连接两个表三个表五个表的SQL语句

一个奇怪的 Oracle SQL,它来自 3 个表,但在 where 子句中只留下了 join 2?

逗号运算符返回参数列表中的第一个值而不是第二个值?

MySQL JOIN 2 个表并分别获取两个表的总和

有没有办法从函数中获取值而不返回它? [关闭]

SQL - 连接 2 个表并返回 2 行之间的值差异