SQL LEFT JOIN 子查询别名

Posted

技术标签:

【中文标题】SQL LEFT JOIN 子查询别名【英文标题】:SQL LEFT JOIN Subquery Alias 【发布时间】:2013-05-22 11:41:45 【问题描述】:

我正在运行这个 SQL 查询:

SELECT wp_woocommerce_order_items.order_id As No_Commande
FROM  wp_woocommerce_order_items
LEFT JOIN 
    (
        SELECT meta_value As Prenom
        FROM wp_postmeta
        WHERE meta_key = '_shipping_first_name'
    ) AS a
ON wp_woocommerce_order_items.order_id = a.post_id
WHERE  wp_woocommerce_order_items.order_id =2198

我得到这个错误:

#1054 - “on 子句”中的未知列“a.post_id”。

我认为我的代码很简单,但我无法正确处理。我究竟做错了什么?

【问题讨论】:

【参考方案1】:

我知道答案有效并且已被接受,但有一种更简洁的方式来编写该查询。在 mysql 和 postgres 上测试。

SELECT wpoi.order_id As No_Commande
FROM  wp_woocommerce_order_items AS wpoi
LEFT JOIN wp_postmeta AS wpp ON wpoi.order_id = wpp.post_id 
                            AND wpp.meta_key = '_shipping_first_name'
WHERE  wpoi.order_id =2198 

【讨论】:

嗨,出于兴趣,这种方法会更有效吗?或者,将“AND wpp.meta_key = '_shipping_first_name'”移动到 WHERE 子句会更有效吗? 老实说,我对其中任何一个都不知道。我刚刚遇到这个答案,并注意到编写查询的方式更简洁,所以我想我会指出这一点。抱歉,我无法提供更多帮助。 在 MySQL/PostgreSQL 中,您可以使用 EXPLAIN SELECT ... 或 MSSQL SET SHOWPLAN_ALL ONSET SHOWPLAN_XML ON 来查看如何检索行。在 MySQL used filesort 中,used temporary 很慢,应该避免使用。至于加入的子查询,它需要在加入 post/order id 之前从 wp_postmeta 表中检索与 meta_key 值匹配的所有行。因此可以安全地假设匹配订单/帖子 ID 和 meta_key 会更快。通常,像您使用的子查询最好使用无法从主查询中过滤的 ORDER BY LIMIT 来自 SQLFiddle 结果的示例:Criteria on Join sqlfiddle.com/#!2/e84fa/5 和 Subquery on Join sqlfiddle.com/#!2/e84fa/3 请注意,Subquery on Join 从 wp_postmeta 检索到 22 行,而 Criteria on Join 仅从 wp_postmeta 检索到 1。跨度> 【参考方案2】:

您没有在子查询中选择post_id。您必须像这样在子查询中选择它:

SELECT wp_woocommerce_order_items.order_id As No_Commande
FROM  wp_woocommerce_order_items
LEFT JOIN 
    (
        SELECT meta_value As Prenom, post_id  -- <----- this
        FROM wp_postmeta
        WHERE meta_key = '_shipping_first_name'
    ) AS a
ON wp_woocommerce_order_items.order_id = a.post_id
WHERE  wp_woocommerce_order_items.order_id =2198 

【讨论】:

非常感谢!我正在处理一个类似的问题,并将 WHERE 子句放在 LEFT JOIN 之前,但出现错误。这真的很有帮助。谢谢! 伙计,你是一个传奇人物,从 pandas 进入 SQL,我一直在摸不着头脑,想知道为什么子查询不起作用。干杯。

以上是关于SQL LEFT JOIN 子查询别名的主要内容,如果未能解决你的问题,请参考以下文章

mysql中多个left join子查询写法以及别名用法

Sql查询left join

通过 LEFT JOIN 优化 SQL 子查询

ORACLE LEFT JOIN 子查询 在SQL SERVER中可以使用如图中的子查询,ORACLE中怎么实现

带有子查询语法的 LEFT OUTER JOIN

MySQL 的子查询和left join的比较,啥时候用子查询效率高,啥时候用left join效率高?