【问题标题】:SQL advanced sub select querySQL高级子选择查询
【发布时间】: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 个结果。

【问题讨论】:

    标签: sql


    【解决方案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 
        

        【讨论】:

          猜你喜欢
          • 2011-10-13
          • 2011-09-22
          • 2010-11-16
          • 1970-01-01
          • 1970-01-01
          • 2019-04-04
          • 2014-11-09
          • 2021-02-11
          • 2015-03-23
          相关资源
          最近更新 更多