안녕하세요...
오늘은 CTE를 사용해서 복잡한 JOIN 구문을 좀 알기 쉽고 편리하게 처리해 볼까 합니다.
먼저 원문입니다.
SELECT AA.SalesOrderID, AA.SalesLastYear, AA.Bonus, AA.Comment, BB.AddressID, BB.CustomerID, BB.AccountNumber, CC.SalesOrderID, CC.SalesPersonID, CC.ShipDate FROM ( SELECT A.SalesOrderID, A.OrderDate, A.Comment, A.SalesPersonID, A.ShipDate, A.CustomerID, B.Bonus, B.CommissionPct, B.SalesLastYear, B.SalesQuota FROM Sales.SalesOrderHeader A, Sales.SalesPerson B WHERE A.SalesPersonID = B.SalesPersonID AND A.SalesOrderID >= 70000 ) AA LEFT OUTER JOIN (SELECT A.CustomerID, A.AccountNumber, A.CustomerType, B.AddressID, B.AddressTypeID FROM Sales.Customer A, Sales.CustomerAddress B WHERE A.CustomerID = B.CustomerID AND A.CustomerID >= 1 AND A.CustomerID <= 20 ) BB ON AA.CustomerID = BB.CustomerID LEFT OUTER JOIN ( SELECT A.SalesOrderID, A.OrderDate, A.Comment, A.SalesPersonID, A.ShipDate, A.CustomerID, B.SalesOrderDetailID, B.ProductID, B.OrderQty FROM Sales.SalesOrderHeader A, Sales.SalesOrderDetail B WHERE A.SalesOrderID = B.SalesOrderID AND A.SalesOrderID >= 70000 ) CC ON AA.CustomerID = CC.CustomerID ; |
보시는 바와 같이 굵은 줄 친 부분 글씨를 유심히 보지 않으면 JOIN 구문 찾기가 쉽지 않습니다. 이것이 CTE를 사용하지 않은 Sub Query 원문이고요.
만약 이것이 여러 개라면 더더욱 복잡해 지겠지요?
그러면 CTE를 사용해서 정리해 보겠습니다.
WITH AA AS ( SELECT A.SalesOrderID, A.OrderDate, A.Comment, A.SalesPersonID, A.ShipDate, A.CustomerID, B.Bonus, B.CommissionPct, B.SalesLastYear, B.SalesQuota FROM Sales.SalesOrderHeader A, Sales.SalesPerson B WHERE A.SalesPersonID = B.SalesPersonID AND A.SalesOrderID >= 70000 ), BB AS (SELECT A.CustomerID, A.AccountNumber, A.CustomerType, B.AddressID, B.AddressTypeID FROM Sales.Customer A, Sales.CustomerAddress B WHERE A.CustomerID = B.CustomerID AND A.CustomerID >= 1 AND A.CustomerID <= 20 ), CC AS ( SELECT A.SalesOrderID, A.OrderDate, A.Comment, A.SalesPersonID, A.ShipDate, A.CustomerID, B.SalesOrderDetailID, B.ProductID, B.OrderQty FROM Sales.SalesOrderHeader A, Sales.SalesOrderDetail B WHERE A.SalesOrderID = B.SalesOrderID AND A.SalesOrderID >= 70000 ) SELECT AA.SalesOrderID, AA.SalesLastYear, AA.Bonus, AA.Comment, BB.AddressID, BB.CustomerID, BB.AccountNumber, CC.SalesOrderID, CC.SalesPersonID, CC.ShipDate FROM AA LEFT OUTER JOIN BB ON AA.CustomerID = BB.CustomerID LEFT OUTER JOIN CC ON AA.CustomerID = CC.CustomerID ; |
각각 With로 시작하고,
Alias와 , 를 사용한 것 외에는 별 다를 것이 없지만.
FROM 절 아래로 JOIN 구문을 내림으로써 훨씬 보게 좋게 JOIN 확인이 가능합니다. ^^.
간단한 팁이지만, 부득이하게 Sub Query가 많아질 경우 JOIN 관계를 알아보기 힘들게 되므로,
이럴 때 쓰시면 편리하실 듯 하네요. ^^
이상입니다.