【问题标题】:SQL Join 2 tables, return records where only 1 value exists and no other valuesSQL Join 2个表,返回只存在1个值而没有其他值的记录
【发布时间】: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' 是唯一存在的值(一次或多次),并且返回的数据记录不存在其他值

非常感谢!

【问题讨论】:

    标签: tsql


    【解决方案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
    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    相关资源
    最近更新 更多