子查询以拉出特定记录

时间:2016-12-06 19:02:41

标签: sql oracle

假设我有3张桌子,a,b和c。 A涉及与c相关的b。我需要从c中提取与a中所有记录相关的所有记录。

如果表a有2条记录而c有3条记录,则以下情况属实:

  • c1涉及a1和a2
  • c2涉及a1
  • c3涉及a1和a2

然后查询将返回c1和c3。

由于某种原因,我无法理解它。

SELECT c.value
FROM c
INNER JOIN b
   ON c.b_id = b.b_id
INNER JOIN a
   ON b.a_id = a.a_id
WHERE c.value IN (???)

2 个答案:

答案 0 :(得分:0)

您的问题和示例代码有不同的关系方向,令人困惑。接受您的代码作为正确关系方向的指标并通过计算来修改它将为您提供一个可能但不是非常优雅的解决方案:

SELECT value FROM (
    SELECT c.value, COUNT(DISTINCT a.a_id) a_qty FROM c
    INNER JOIN b ON c.b_id = b.b_id
    INNER JOIN a ON b.a_id = a.a_id
    GROUP BY c.value
) WHERE a_qty = (SELECT COUNT(*) FROM a)

答案 1 :(得分:0)

我的经验是Oracle优化器将在高效执行时做得很好,尤其是在匹配列被索引的情况下:

SELECT *
  FROM c
 WHERE EXISTS
           (SELECT NULL
              FROM a
                   INNER JOIN b
                       ON (a.abmatch = b.abmatch)
                      AND b.cbmatch = c.cbmatch);