【问题标题】:SQL - Get additional records apart from records filtered in where conditionSQL - 获取除以 where 条件过滤的记录之外的其他记录
【发布时间】:2020-06-10 13:38:34
【问题描述】:

我有 3 张桌子:

TableA - Id, TableB_id

TableB - Id, Name, TableC_id

TableC - Id, Valid

有效值可以是 0 或 1。

TableA -> TableB 和 TableB -> TableC 之间存在一对多的关系。

我想获取 TableC.valid = 0 的 TableA 和 TableB 的所有记录。

另外,来自 TableA 和 TableB 的记录,即使 TableC 中没有关联的记录。

我已经为第一部分编写了查询,但是如何包含第二个条件? (如果可能,不使用联合)

查询:

Select 
    a.id,
    b.id,
    b.name,
    c.id
from
    TableA a
    left join TableB b on a.TableB_id = b.id
    left join TableC c on b.TableC_id = c.id
where
    c.valid = 1;

【问题讨论】:

  • 执行 left join TableC c on b.TableC_id = c.id AND c.valid = 1; 以获得真正的 LEFT JOIN 结果。
  • 谓词c.valid = 1 击败了左连接,有效地将它们转换为内连接。将该谓词放在ON 子句中,而不是WHERE 子句中。

标签: sql oracle


【解决方案1】:

left join 中,除第一个表之外的所有表的条件通常放在on 子句中:

Select a.id, b.id, b.name, c.id
from TableA a left join
     TableB b 
     on a.TableB_id = b.id left join
     TableC c
     on b.TableC_id = c.id and c.valid = 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2018-02-17
    相关资源
    最近更新 更多