我刚问了一个关于别名的问题,并了解到FROM子句中的子查询必须通过放置“AS [别名]”来别名。现在我仍然遇到同样的问题。
我正在尝试自然加入4关系产品,笔记本电脑,个人电脑和打印机。
我可以非常轻松地完成SELECT * FROM product NATURAL JOIN pc;
。但我正在尝试
SELECT * FROM product NATURAL JOIN pc, laptop, printer;
当我尝试时,我知道这可能不起作用。
所以我目前正在
SELECT *
FROM (
SELECT * FROM (
SELECT * FROM product NATURAL JOIN pc AS prod_pc
) AS prod_pc_lap NATURAL JOIN laptop
) NATURAL JOIN printer;
但我一直收到1248错误。
注意每个关系主键是“model”。
答案 0 :(得分:0)
为什么不这样:
SELECT p.model, COALESCE(pr.price, l.price, pc.price, 0) AS price
FROM product p
LEFT OUTER JOIN printer pr ON pr.model = p.model
LEFT OUTER JOIN laptop l ON l.model = p.model
LEFT OUTER JOIN pc ON pc.model = p.model
COALESCE()
函数将按顺序计算每个参数,并返回它看到的第一个非空值。
答案 1 :(得分:0)
,
子句中的逗号FROM
(或多或少),相当于CROSS JOIN
。因此,您的查询等同于:
SELECT *
FROM
product
NATURAL JOIN
pc
CROSS JOIN
laptop
CROSS JOIN
printer ;
如果您需要NATURAL JOIN
,可以:
SELECT *
FROM product
NATURAL JOIN pc
NATURAL JOIN laptop
NATURAL JOIN printer;
以上可能会返回0行(除非您的产品同时是个人电脑,笔记本电脑和打印机)。您可以尝试将NATURAL JOIN
替换为NATURAL LEFT JOIN
。
答案 2 :(得分:0)
对于你的情况,我猜一个内部联接也会起作用。无论如何,对于任何类型的加入,如果using(key)
相同,则可以使用on tbl1.key = tbl2.key
代替key
。
所以你的查询看起来像是
SELECT *
FROM product
INNER JOIN pc
USING (model)
INNER JOIN laptop
USING (model)
INNER JOIN printer
USING (model);