2016-08-23 6 views
0

enter image description hereSQL 초급 : 2 개 테이블 (+ 그룹 + 주문)

에서 항목을 얻기 나는 전자 상거래 웹 사이트 (VirtueMart 사용)하고 난 아이 제품 구성 제품을 판매합니다. 제품이 부모 인 경우 ParentID가없고, 자녀가 참조하는 제품입니다. 나는 최고의 논리가 아니라 그것을 만든다는 것을 안다.

내 SQL은 매우 기본적인 그리고 내가 아이를 가질

  • 제품 선택을 달성하기 아주 쉬운 뭔가를 물어 생각합니다.
  • 가격별로 정렬 (ASC/DSC).
+1

당신은 [존재] (http://www.w3resource.com/sql/special-operators/sql_exists.php) 연산자를 필요 –

+0

당신의 DB에 태그를하시기 바랍니다. – ceving

+0

당신은 [tag : common-table-expression]을 사용하여 [tag : recursive-queries]를 찾고있다. (부모가없는 행을 식별하기 위해서는 0 대신에'NULL'을 사용해야한다.)'0 '당신은 당신의 제품 테이블에 적절한 외래 키 제약 조건을 가질 수 없다) –

답변

1

이 표 디자인은 여러 가지 이유로 표준입니다. 첫째, 값 0은 부모가 없음을 나타내는 데 사용됩니다 (제품에 0 ID가 없음). 일반적으로 이것은 NULL 값이됩니다.

는 NULL 값이 같이 간단 할 것 부모없이 모든 것을 얻을 수있는 SQL 문 있다면 그러나

SELECT * FROM Products WHERE ParentID IS NULL 

을, 우리는 할 수 없습니다. 우리는 0 = 부모 나, 우리는이 작업을 수행 할 수 있다는 가정을 할 경우

SELECT * FROM Products WHERE ParentID = 0 

그러나,이 만들 수있는 위험한 가정이다. 따라서,이 (위 스키마 제공) 할 수있는 올바른 방법은 두 테이블을 비교하고 parentID이 제품 ID로 존재하는지 확인하는 것입니다 :

SELECT a.* 
FROM Products AS a 
WHERE EXISTS (SELECT * FROM Products AS b WHERE a.ID = b.ParentID) 

다음으로, 가격을 얻기 위해, 우리는 가입해야 이 두 테이블은 공통 ID에 함께 있습니다.

SELECT p.ProductID, p.ProductName, pr.Price 
FROM Products AS p INNER JOIN Prices AS pr ON p.ProductID = pr.ProductID 
WHERE EXISTS (SELECT * FROM Products AS b WHERE p.ID = b.ParentID) 
ORDER BY pr.Price 

것은 당신이 표시 한 데이터에 따라 충분 수도 있지만, 일반적으로 테이블 구조의 유형은 더 가질 수 있음을 나타냅니다 : 가격 테이블이 제품 ID를 참조하는 것, 우리는 그렇게 같은 것을 사용할 수 있습니다 제품과 관련된 하나의 가격 (빠른 스냅 샷을 기반으로 이것이 사실인지 여부를 알 수 없습니다)보다 중요합니다.

더 가까워 져야합니다 ... 더 필요한 것이 있으면 더 자세한 정보가 필요합니다.

0

당신은 self-join를 사용해야 할 것입니다 : 예를 들어

:

SELECT * FROM products parent 
JOIN products children ON parent.id = children.parent_id 
JOIN prices ON prices.product_id = children.id 
ORDER BY prices.price 

을 우리가 자식이없는 모든 항목을 걸러을 가입 사용하고 있기 때문에.

테스트를 거치지 않았으므로 효과가 있기를 바랍니다.

1

SELECT * FROM Products INNER JOIN Prices ON Products.ProductID = Prices.ProductID ORDER BY Products.Price [ASC/DSC]

설명 :

SELECT - 선택

* (검색/가져 오기) - ALL

FROM Products을 - DB를 테이블에서 이름이 "제품"을 취득합니다.

INNER JOIN Prices - 두 테이블의 열이 일치하는 한 두 테이블의 모든 행을 선택합니다. 오히려 JOIN DB 테이블 "제품"DB 테이블 "가격".

ON - WHERE과 유사하게 일치 여부를 확인할 행을 정의합니다.

Products.ProductID = Prices.ProductID - 일치 기준입니다. DB 테이블 "제품"과 "가격"에 "ProductID"가있는 행을 가져옵니다.

ORDER BY Products.Price [ASC/DSC] - 정렬. 오름차순은 ASC, 오름차순은 DSC을 사용하십시오.

1

ssms를 사용하는 경우 아래 스크립트를 사용하십시오.

SELECT pd.ProductId,ProductName,Price 
FROM product pd 
LEFT JOIN price pr ON pd.ProductId=pr.ProductID 
WHERE EXISTS (SELECT 1 FROM product pd1 WHERE pd.productID=pd1.ParentID) 
ORDER BY pr.Price ASC 

참고 : 상위 제품 모두 가격표에 가격이 없습니다. 자녀 제품 가격의 합계를 원하면 아래 스크립트를 사용하십시오.

SELECT pd.ProductId,pd.ProductName,SUM(ISNULL(pr.Price,0)) SUM_ChildPrice 
FROM product pd 
LEFT JOIN product pd1 ON pd.productID=pd1.ParentID 
LEFT JOIN price pr ON pd1.ProductId=pr.ProductID 
GROUP BY pd.ProductId,pd.ProductName 
ORDER BY pr.Price ASC