에서 항목을 얻기 나는 전자 상거래 웹 사이트 (VirtueMart 사용)하고 난 아이 제품 구성 제품을 판매합니다. 제품이 부모 인 경우 ParentID가없고, 자녀가 참조하는 제품입니다. 나는 최고의 논리가 아니라 그것을 만든다는 것을 안다.
내 SQL은 매우 기본적인 그리고 내가 아이를 가질
- 제품 선택을 달성하기 아주 쉬운 뭔가를 물어 생각합니다.
- 가격별로 정렬 (ASC/DSC).
에서 항목을 얻기 나는 전자 상거래 웹 사이트 (VirtueMart 사용)하고 난 아이 제품 구성 제품을 판매합니다. 제품이 부모 인 경우 ParentID가없고, 자녀가 참조하는 제품입니다. 나는 최고의 논리가 아니라 그것을 만든다는 것을 안다.
내 SQL은 매우 기본적인 그리고 내가 아이를 가질
이 표 디자인은 여러 가지 이유로 표준입니다. 첫째, 값 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를 참조하는 것, 우리는 그렇게 같은 것을 사용할 수 있습니다 제품과 관련된 하나의 가격 (빠른 스냅 샷을 기반으로 이것이 사실인지 여부를 알 수 없습니다)보다 중요합니다.
더 가까워 져야합니다 ... 더 필요한 것이 있으면 더 자세한 정보가 필요합니다.
당신은 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
을 우리가 자식이없는 모든 항목을 걸러을 가입 사용하고 있기 때문에.
테스트를 거치지 않았으므로 효과가 있기를 바랍니다.
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
을 사용하십시오.
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
당신은 [존재] (http://www.w3resource.com/sql/special-operators/sql_exists.php) 연산자를 필요 –
당신의 DB에 태그를하시기 바랍니다. – ceving
당신은 [tag : common-table-expression]을 사용하여 [tag : recursive-queries]를 찾고있다. (부모가없는 행을 식별하기 위해서는 0 대신에'NULL'을 사용해야한다.)'0 '당신은 당신의 제품 테이블에 적절한 외래 키 제약 조건을 가질 수 없다) –