【问题标题】:Mysql subquery with conditional left outer join具有条件左外连接的 Mysql 子查询
【发布时间】:2011-03-12 07:20:05
【问题描述】:

尝试在子查询 FROM 子句中使用来自外部查询的参数。

tbl1:
| id | val1 | str1 |
| 1  | 12   | sbc  |
| 2  | 22   | sds  |

tbl2:
| id | val1 | str1 |
| 1  | 1    | cp   |

尝试编写以下查询:

select * from
    tbl1 t, (select * from tbl2 where t.id = tbl2.id and tbl2.val1 = 1) tb12;

预期输出:

| id | val1 | str1 | id   | val1 | str1 |
| 1  | 12   | sbc  | 1    | 1    | cp   |
| 2  | 22   | sds  | null | null | null |

但它失败并出现错误:

/* SQL Error (1054): Unknown column 't.id' in 'where clause' */

我在这里做错了什么?

【问题讨论】:

    标签: mysql mysql-error-1054


    【解决方案1】:

    有什么理由不使用这样的普通旧左连接:

    select * from tbl1 t1 left join tbl2 t2 on t1.id = t2.id;
    

    【讨论】:

    • 我已经更新了问题,请注意固定查询以更好地解释问题。我想做一个“有条件的左外连接”
    【解决方案2】:
    SELECT  *
    FROM    tbl1 t
    LEFT JOIN
            tbl2 t2
    ON      t2.id = t.id
            AND t2.val1 = 1
    

    【讨论】:

      【解决方案3】:
       SELECT * tbl1 UNION select * from tbl2;
      

      会产生相同的结果

      【讨论】:

      • 不,它不会,因为要求是左侧的行与右侧的匹配数据(如果存在)。但不是右边的行与左边的不匹配。顺便说一句,旁注:这个问题在 2 年前非常有趣。今天是 NoSQL 世界。技术确实发展得很快……
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多