SQL高级子选择查询
Posted
技术标签:
【中文标题】SQL高级子选择查询【英文标题】:SQL advanced sub select query 【发布时间】:2012-04-10 14:49:01 【问题描述】:我想扩展这个简单的子选择:
Select * from table1 where pkid in (select fkid from table2 where clause...)
上面的逻辑相当简单 - 获取 table1 中 pkid 包含在从具有 where 子句的子选择查询返回的子集中的所有行。它运作良好,因为只有 1 个字段被返回。
现在我想对此进行扩展。
在表 1 中我想返回结果 where field1 and field2 and field3 in select (field1, field2, field3 from table2 where 子句...)
这怎么可能?
提前致谢。
示例。
表 1
FIELD1 FIELD2 FIELD3
1 2 3
2 3 4
4 5 6
表 2
2 3 4
4 5 6
我想返回 2 个结果。
【问题讨论】:
【参考方案1】:如果我了解您的需求,您可以尝试:
SELECT t1.field1, t1.field2, t1.field3 FROM table1 t1
INNER JOIN table2 t2
ON t1.field1 = t2.field1
AND t1.field2 = t2.field2
AND t1.field3 = t2.field3
AND t2.... // Use this as WHERE condition
【讨论】:
是的,如果问题难以理解,我很抱歉。但我认为你已经成功了。【参考方案2】:就像 Marco 指出的那样,您想要做的是INNER JOIN
。
但是(仅供参考,您绝对应该使用 Marco 的解决方案)也可以简单地使用大括号。
Select *
from table1
where (field1, field2, field3) in (select field1, field2, field3 from table2 where clause...)
至少在 mysql 中(这个问题不是用 MySQL 标记的吗?)
【讨论】:
假设很多。 ORACLE 可以做到这一点,例如 SQL SERVER 不能。 @Dems:它是有效的标准 SQL,如果问题只有sql
标签,这肯定是可以接受的。
@onedaywhen - 在我的评论之后添加了引用 At least in MySQL (wasn't this question tagged with MySQL?)
。如果没有这个添加,答案意味着它适用于所有版本的 SQL,这是错误的。
@Dems:你的意思是说所有版本的SQL?您将如何测试/证明 SQL 语句满足该条件?假设你不能,我会说发布带有产品和版本声明的专有代码或标准 SQL(最好有适当的声明)是可以接受的。
@onedaywhen - 没有实现 standard SQL
并且答案在我发表评论时没有指定它在哪个版本的 SQL 中起作用或不起作用。我不觉得提请注意 它只在某些实现中有效 是一个不好的评论。它甚至提示答案的发布者添加评论以澄清细节。我不确定为什么会如此有争议。答案缺少相关信息,我提请注意,答案已更新以反映这一点。到目前为止,这一切似乎都富有成效......【参考方案3】:
你可以使用临时表
select field1, field2, field3 into #tempTable from table2 where clause...
select * from table 1
where filed1 in (select field1 from #tempTable)
and filed2 in (select field2 from #tempTable)
and filed3 in (select field3 from #tempTable)
【讨论】:
【参考方案4】:在大多数情况下避免使用IN
。这是非常有限的。
在大多数情况下,我更喜欢使用 JOIN。
SELECT
*
FROM
yourTable
INNER JOIN
(SELECT c1, c2, c3 FROM anotherQuery) AS filter
ON yourTable.c1 = filter.c1
AND yourTable.c2 = filter.c2
AND yourTable.c3 = filter.c3
(确保过滤器返回c1, c2, c3
的唯一组合,必要时使用DISTINCT
或GROUP BY
)
【讨论】:
【参考方案5】:你没有提到引擎,所以我假设 SQL Server。 此查询将向您显示两个表上的内容
select FIELD1, FIELD2 from table1
intersect
select FIELD1, FIELD2 from table2
【讨论】:
以上是关于SQL高级子选择查询的主要内容,如果未能解决你的问题,请参考以下文章