SQL LEFT JOIN 하위 쿼리 별칭


87

이 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 clause'의 알 수없는 열 'a.post_id'.

내 코드는 매우 간단하다고 생각하지만 올바르게 만들 수 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변:


145

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 

1
정말 고맙습니다! 비슷한 문제로 작업 중이며 LEFT JOIN 앞에 WHERE 절을 넣고 오류가 발생했습니다. 이것은 정말 도움이되었습니다. 감사!
allardbrain 2017

1
친구, 넌 판다에서 SQL로 온 전설이고 나는 왜 하위 쿼리가 작동하지 않는지 궁금해하는 순간 내 머리를 긁적이었다. 건배.
Manakin

21

나는 대답이 작동하고 받아 들여 졌다는 것을 알고 있지만 그 쿼리를 작성하는 훨씬 더 깨끗한 방법이 있습니다. 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 

1
안녕하세요, 관심이 없습니다.이 방법이 더 효율적일까요? 또는 "AND wpp.meta_key = '_shipping_first_name'"을 WHERE 절로 이동하는 것이 더 효율적입니까?
Chris

1
솔직히 그 둘 중 하나에 대해 전혀 모릅니다. 나는 방금이 대답을 보았고 쿼리를 작성하는 더 깨끗한 방법이 있음을 알았으므로 그것을 지적 할 것이라고 생각했습니다. 더 이상 도움을 드릴 수 없어서 죄송합니다.
EJay

1
MySQL은 / PostgreSQL을에서 당신은 사용할 수 있습니다 EXPLAIN SELECT ...또는 MSSQL에 대한 SET SHOWPLAN_ALL ON또는 SET SHOWPLAN_XML ON행을 검색하는 방법을 참조하십시오. MySQL used filesort에서는 used temporary느리고 피해야합니다. 조인 된 하위 쿼리의 경우 게시 / 주문 ID에 조인하기 전에 wp_postmeta 테이블에서 meta_key 값과 일치하는 모든 행을 검색해야합니다. 따라서 주문 / 게시 ID 및 meta_key에서 일치하는 것이 더 빠를 것이라고 가정하는 것이 안전해야합니다. 일반적으로 사용한 것과 같은 하위 쿼리 ORDER BY LIMIT는 기본 쿼리에서 필터링 할 수없는에 가장 적합합니다.
Will B.

1
: SQLFiddle 결과로부터 실시 예 Criteria on Join sqlfiddle.com/#!2/e84fa/5Subquery on Join sqlfiddle.com/#!2/e84fa/3 (가) 참고 Subquery on Join그동안 wp_postmeta에서 22 개 행을 검색 Criteria on Join만 wp_postmeta 1 검색된.
Will B.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.