SQL 外连接 2 个表

Posted

技术标签:

【中文标题】SQL 外连接 2 个表【英文标题】:SQL Outer join 2 tables 【发布时间】:2014-03-06 10:50:54 【问题描述】:

我有两张桌子,comp_productcomp_product_marchand

comp_product 包含产品信息(描述、名称等)

comp_product_marchand 包含不同的价格(产品经销商)。每个经销商都有一个产品的价格。但并非适用于所有产品

我只想为每个经销商获取一个 SQL 查询产品列表和他的价格(即使经销商没有)

我有这个 SQL 查询:

SELECT
    p.id_product,
    pm.price
FROM comp_product_marchand pm
LEFT OUTER JOIN comp_product p
    ON p.id_product = pm.id_product
WHERE id_marchand = 4

(WHERE 子句仅用于演示)

此 SQL 查询返回有价格的产品的价格,而不是其他产品的价格... 有什么想法吗?

【问题讨论】:

你能发个小提琴吗 img15.hostingpics.net/pics/936101Sanstitre.png 【参考方案1】:

更改表格之间的链接:

SELECT
    p.id_product,
    pm.price
FROM comp_product p
LEFT OUTER JOIN comp_product_marchand pm
    ON p.id_product = pm.id_product
    AND id_marchand = 4

通过这种方式,您将显示所有产品,如果 marchand = 4 有一个,则将显示有关 marchand 的信息。

我将查询放在了 ON 子句中的 marchand ID 上,因为如果你把它放在 WHERE 子句中,你将剪切掉没有该产品的 Marchand 的所有行

【讨论】:

@FabienPapet:祝你有美好的一天;) +1 :这个答案还将查询的顺序从price LEFT JOIN product(如OP的帖子中)反转为product LEFT JOIN price,从而确保所有产品始终包含在JOIN的结果中. @MatBailie:谢谢。祝你有美好的一天;)【参考方案2】:

您需要更改联接的操作方式。您可以使用当前查询并使用RIGHTjoin,或者我更喜欢的方式是切换表的顺序(仍然使用LEFT join),以便您希望查看所有结果的表位于连接的左侧。有时是一个困难的概念,但这张图可以提供帮助

切换加入代码: 选择 p.id_product, pm.price

    FROM comp_product p
               LEFT OUTER JOIN comp_product_marchand pm ON 
                               p.id_product=pm.id_product 
                               AND id_marchand=4 ;

【讨论】:

您不能放入 WHERE 子句 id_marchand = 4 因为当 comp_product_marchand 以这种方式不存在时,您会剪切该行 我以为这只是针对该商家的过滤?所以他的查询只返回一次商家的价格和产品。 感谢您的帮助,您的图表对我有很大帮助! ;) @Telexx:嗨,我们的 OP 想要那个 marchant 的所有产品,但是如果这个 marchant 没有产品,他想展示那个产品。 @Telexx:修正你的答案,+1 以获得详细的 JOIN 解释

以上是关于SQL 外连接 2 个表的主要内容,如果未能解决你的问题,请参考以下文章

SQL怎么连接查询2个表?

MySQL的几种表外连接及PHP操作MySQL的函数

SQL'左外连接与2个右表

SQL查询---内连接外连接自连接查询

如何使用 ANSI sql 外连接表 [重复]

如何使用外键连接 Django 中的对象 2 个表深