MySQL错误1248,创建正确的查询。 x3自然联接

时间:2012-04-03 20:23:29

标签: mysql

我刚问了一个关于别名的问题,并了解到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”。

3 个答案:

答案 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);