【问题标题】:Is it possible to JOIN with a var from a LEFT JOIN without destrorying rows?是否可以在不破坏行的情况下使用 LEFT JOIN 中的 var 进行 JOIN?
【发布时间】:2010-01-29 01:57:40
【问题描述】:

我的代码生成了一个大型查询。一个简单的版本是

SELECT * FROM main_table as mt
JOIN user_data AS ud ON mt.user_id=ud.id 
LEFT JOIN ban_Status AS bs ON  ud.status_id=bs.id
JOIN AnotherTable ON bs.data=AnotherTable.id

注意:此代码未经测试。

当我删除最后一个加入时,我得到了结果。我也可以将其更改为左连接,但这是错误的。如果 ud.status 不为空,我想要一个连接,就像我从 ban_Status 执行选择查询时一样。我该如何解决?如果我离开父表,我必须在每个表上写左联接吗?那不会给我带来副作用吗?

我正在使用 sqlite ATM,但将切换到 tsql

【问题讨论】:

    标签: tsql sqlite


    【解决方案1】:

    使用 LEFT JOIN,但在 WHERE 子句中指定 ud.status_id 为 null 且 AnotherTable.id 为 null 或两者都不为 null。

    SELECT * FROM main_table as mt
    JOIN user_data AS ud ON mt.user_id=ud.id 
    LEFT JOIN ban_Status AS bs ON  ud.status_id=bs.id
    LEFT JOIN AnotherTable ON bs.data=AnotherTable.id
    WHERE (ud.status_id is null and AnotherTable.id is null)
           or (ui.status_id is not null and AnotherTable.id is not null)
    

    这将使您无法选择任何具有 ban_Status 但没有其他表中的附加数据的记录。

    【讨论】:

    • +1。这似乎可行,但您能否解释一下为什么 INNER JOIN 在 LEFT JOIN 链中向下似乎使所有这些 LEFT JOIN 都表现为 INNER JOIN?
    • 如果LEFT JOIN 不能加入一行,那么它将在他的所有字段中返回NULL。然后,如果您在 NULL id 上使用 INNER JOIN,整个行将被丢弃(由于 INNER JOIN 规则)。
    • 并不是内部连接在列表的下方,而是它连接到连接右侧的表。如果它加入了别名为 ud 的表,你就不会遇到这个问题。我仍然想把我所有的左连接放在连接的末尾,这有点提醒我,如果我加入任何东西,我也需要把它变成左连接。
    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2020-04-24
    • 2019-07-23
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多