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 的唯一组合,必要时使用DISTINCTGROUP BY

【讨论】:

【参考方案5】:

你没有提到引擎,所以我假设 SQL Server。 此查询将向您显示两个表上的内容

select FIELD1, FIELD2 from table1 
intersect
select FIELD1, FIELD2 from table2 

【讨论】:

以上是关于SQL高级子选择查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL练习 高级子查询

SQL高级子查询

SQL高级语句(包含子查询,连接查询,视图联集等)

SQL高级语句(包含子查询,连接查询,视图联集等)

SQL 2005 使用 PHP 链接 Access 2003 DB 高级子查询

SQL编程之高级查询及注意事项