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 IN
和NOT 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个值而没有其他值的记录的主要内容,如果未能解决你的问题,请参考以下文章