MySQL - 加入两个在其中包含别名和连接的SELECT语句

时间:2017-10-25 20:55:54

标签: mysql sql

当两者在自己的select语句中都有自己的别名和表引用时,如何加入A.ID_Number和B.ID_Number?最后一行目前不正确,我需要知道如何解决这个问题。

SELECT*FROM
(SELECT b.ID_Number, b.Price, s.Quantity FROM tbl_bills b
 LEFT JOIN tbl_stock s ON b.Price = s.Price)
AS X

LEFT JOIN

(SELECT c.ID_Number, c.Currency, p.Purchased FROM tbl_currency c
WHERE blahblahblah)
AS Y

ON X.b.ID_Number = Y.c.ID_Number

可能有更好的方法来完成整个语句,但我只想知道如何正确地执行最后一行,因为我的实际查询很多,更长。

编辑:问题解决了。

4 个答案:

答案 0 :(得分:2)

您必须取消b.c.

ON X.ID_Number = Y.ID_Number

答案 1 :(得分:2)

主查询看不到子查询中的表名和别名。只需参考列名称。

ON X.ID_Number = Y.ID_Number

答案 2 :(得分:2)

您只使用您定义的别名。 。 。 XY。以下是整个查询中的示例:

SELECT x.ID_Number, x.Price, x.Quantity, y.ID_Number, y.Currency, y.Purchased
FROM (SELECT b.ID_Number, b.Price, s.Quantity
      FROM tbl_bills b LEFT JOIN
           tbl_stock s
           ON b.Price = s.Price
     ) X LEFT JOIN
     (SELECT c.ID_Number, c.Currency, p.Purchased
      FROM tbl_currency c
      WHERE blahblahblah
     ) Y
     ON X.ID_Number = Y.ID_Number;

请注意,p.purchased仍有与无法识别的列名相同的错误。

对我来说,这是编写查询的愚蠢方式。我会改用:

SELECT b.ID_Number, b.Price, s.Quantity, c.Currency, p.Purchased  -- c.ID_Number, is not needed unless you want to see if there is a match
FROM tbl_bills b LEFT JOIN
     tbl_stock s
     ON b.Price = s.Price LEFT JOIN
     tbl_currency c
     ON b.ID_Number = c.ID_Number AND blahblahblah;

这更短,更容易编写,更易于阅读,并且应该具有更好的性能,不会实现子查询。

答案 3 :(得分:1)

我会这样做:

SELECT b.ID_Number, b.Price, s.Quantity, c.Currency
FROM tbl_bills b
    LEFT JOIN tbl_stock s USING (Price)
    LEFT JOIN tbl_currency c
        ON c.ID_Number = b.ID_Number AND { other criteria goes here }

要获得更具体的信息,您需要发布实际查询。

要解决您的更新"如果我尝试X.ID_Number = Y.ID_Number,我会收到错误"未知栏' X.ID_Number in' on子句& #39;" - 唯一的原因是您的实际查询与您发布的查询不同。人们根据您发布的代码提供答案。在两个子查询中选择ID_Number非常重要,加入将起作用。