1

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

请注意,每个关系主键都是“模型”。

4

3 回答 3

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 行(除非您的产品同时是 pc、笔记本电脑和打印机)。您可以尝试替换NATURAL JOINNATURAL LEFT JOIN.

于 2012-04-03T21:16:11.017 回答
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()函数将按顺序评估每个参数并返回它看到的第一个非空值。

于 2012-04-03T21:09:49.840 回答
0

对于您的情况,我想内部连接也可以。无论如何,对于任何类型的连接,您都可以使用if is sameusing(key)来代替。on tbl1.key = tbl2.keykey

所以你的查询看起来像

SELECT *
FROM   product
       INNER JOIN pc
USING  (model)
       INNER JOIN laptop
USING  (model)
       INNER JOIN printer
USING  (model);
于 2012-04-04T06:30:12.560 回答