使用右侧约束在MySQL中创建左外连接

时间:2010-07-23 10:36:00

标签: mysql join outer-join mysql-error-1349

根据https://stackoverflow.com/questions/3264227/relations-with-multiple-keys-in-doctrine-1-2,我有两个表(因为我无法在Doctrine中使用它)我正在尝试作为MySQL视图加入:

部分:

  • PART_ID
  • PRODUCT_ID
  • part_type_id
  • part_short_code
  • ...

part_translation:

  • part_type_id
  • part_short_code
  • LANGUAGE_ID
  • internationalised_name
  • ...

关于part_type_id和part_short_code必须在各个表中匹配的约束。

事实证明这很复杂:

  • 右边的表格(part_translation)可能没有相应的行(因此左边的连接)
  • 右侧表仅在part_short_code!=''和language_id = 1
  • 时有效加入

我有一个有效的查询:

SELECT *来自LEFT OUTER JOIN部分 (SELECT * FROM part_translation WHERE language_id = 1 AND part_short_code!='')as part_data_uk 使用(part_type_id,part_short_code)

但是a)它很慢(可能是由于子查询)和b)我无法将其转换为视图,因为我收到错误“#1349 - View的SELECT包含FROM子句中的子查询”

我无法弄清楚如何将约束添加到右侧表而不会使联接充当内部联接和技能所有右侧为空的行。

有人能告诉我如何优化/改进这个查询,以便摆脱子查询并使其在视图中可用吗?

使用MySQL 5.0.45,FWIW。

谢谢,   理查德

1 个答案:

答案 0 :(得分:3)

你可以在ON部分放置任何东西。不会是一个美丽的景象,但它可以工作:

SELECT * FROM `part` `p` LEFT JOIN `part_translation` `t` ON (
    `p`.`part_type_id` = `t`.`part_type_id`
    AND `p`.`part_short_code` = `t`.`part_short_code`
    AND `t`.`part_short_code` != ""
    AND `t`.`language_id` = 1
)