COMPLEX SQL / SELECT - INNER JOIN

时间:2014-09-23 02:55:42

标签: sql join

我想构建一个复杂的SQL查询。

表格图片:

首先,我想选择所有条目WHERE column_1和column_2具有相似的id,并且WHERE Column_3等于1.

因此,它应该只返回id:10000001和10000002以及NOT ID:10000003和10000004,因为id 10000004在column_3中有2,因此不是id 10000003的倒数。

其次,一旦从table_1中选择了ids 10000001和10000002,我想从table_2中检索数据。

因此,我希望有一个查询可以帮助我获取table_1.column_2 FROM table中的ids_1 WHERE table_1.column_1 AND table_1.column_2彼此有ID并且table_column_3等于1.

3 个答案:

答案 0 :(得分:0)

这样做: 它使用内部联接来从同一个表中提取数据并比较其列。

    select * from table_2
    where column_1
    in
    (
        select a.column_1
        from table_1 a inner join table_1 b on a.column_1=b.column_2 and column_3=1

    )

让我知道它是否有效。

答案 1 :(得分:0)

我认为masum7的答案是正确的,除非您可能需要指定a.column_3和b.column_3都等于1.

我喜欢嵌套查询。如果您不能或不想使用它们,您可以像以下示例一样将其展平:

select t2.column_2
from table_1 as t1a, table_1 as t1b, table_2 as t2
where t1a.column_1 = t1b.column_2 and t1a.column_3 = 1
and t1a.column_2 = t1b.column_1 and t1b.column_3 = 1
and t1a.column_1=t2.column_1;

此语法适用于sqlite,但可能需要对其他数据库进行一些调整。

答案 2 :(得分:0)

可以通过多种方式完成。到目前为止,masum7 vai的解决方案似乎是最好的。然而,除此之外,它也可以通过以下方式完成:

 SELECT * FROM table_2 as t2
 WHERE t2.column_1 IN
 (SELECT t1.column_1 FROM table_1 as t1
 WHERE t1.column_1 IN (SELECT t1.column_2 FROM table_1 as t1)
 AND t1.column_3 = 1)

有点复杂,因为我使用了子查询而不是连接。所以让我解释一下。

第一部分:

 SELECT * FROM table_2 as t2

将从table_2检索所有值。

但话又说回来,根据table_2的一些特定数据,您需要来自table_1的一些 SPECIFIC 数据。所以这里有WHERE子句和用于从table_1检索数据的子查询。

第二部分:

  WHERE t2.column_1 IN
  (SELECT t1.column_1 FROM table_1 as t1
  WHERE t1.column_1 IN (SELECT t1.column_2 FROM table_1 as t1)
  AND t1.column_3 = 1)

可以分解为更多的子部分。

子部分 - 1:

  SELECT t1.column_1 FROM table_1 as t1

将检索column_1 table_1所有值。

但是,那不是你想要的。您想要特定

一个。 column_1中存在column_2的{​​{1}}值    湾同时,column_1值为column_3的{​​{1}}值。

基于这两点,来自第2部分。

子部分 - 2:

  WHERE t1.column_1 IN (SELECT t1.column_2 FROM table_1 as t1)
  AND t1.column_3 = 1)

第一个WHERE条件表示column_1值必须存在于嵌套子查询中,该子查询具有所有column_2值。第二个说,相应的column_3值必须为1.

希望此查询检索您的预期结果,并且您了解我对查询的解释。祝你好运,祝你有愉快的一天!祝你在StackOverflow中旅途愉快。 :)

修改-1

只是查询的一小部分内容。我忘了添加GROUP BY条款。它应该是GROUP BY t2.column_1

因此修改后的查询变为:

 SELECT * FROM table_2 as t2
 WHERE t2.column_1 IN
 (SELECT t1.column_1 FROM table_1 as t1
 WHERE t1.column_1 IN (SELECT t1.column_2 FROM table_1 as t1)
 AND t1.column_3 = 1)
 GROUP BY t2.column_1

抱歉,我错过了。 :)