2009-12-14 2 views
0

여기에이 MySQL 쿼리는 어떻게 단축 할 수 있습니까?

어쨌든이 MySQL 쿼리를 줄이는가 ??? 가격 규칙에 따라 RuleValue라는 열에서 PriceRuleDetail 테이블에서 두 개의 다른 행을 가져와야하지만 별칭을 사용하여 같은 행에 반환해야합니다. 그것은 select 문 안에있는 서브 쿼리를 사용하고 있는데, 나는 옳다고 생각하지만, 더 쉬운 방법이있을 수 있습니까?

아래의 내용은 올바르게 작동하고 비교적 만족 스럽지만,이 방법을 줄이면 궁금합니다.

SELECT Stock.*, 
    (SELECT PriceRuleDetail.RuleValue 
    FROM PriceRuleDetail 
    WHERE PriceRuleDetail.Sku = Stock.Sku 
    AND PriceRuleDetail.PriceRule = 'RG' 
    AND PriceRuleDetail.Quantity = 1) as Price, 
    (SELECT PriceRuleDetail.RuleValue 
    FROM PriceRuleDetail 
    WHERE PriceRuleDetail.Sku = Stock.Sku 
    AND PriceRuleDetail.PriceRule = 'RRP' 
    AND PriceRuleDetail.Quantity = 1) as WasPrice 
FROM Stock, StockCategoryMemberList 
WHERE StockCategoryMemberList.Sku = Stock.Sku 
AND StockCategoryMemberList.CategoryCode = 'FIRE' 

미리 감사드립니다. 조인과 앤디

답변

4

달성 조인이

SELECT Stock.*, 
     PRD1.RuleValue as Price, 
     PRD2.RuleValue as WasPrice 
FROM 
    Stock INNER JOIN 
    StockCategoryMemberList ON StockCategoryMemberList.Sku = Stock.Sku LEFT JOIN 
    PriceRuleDetail PRD1 ON PRD1.Sku = Stock.Sku 
         AND PRD1.PriceRule = 'RG' 
         AND PRD1.Quantity = 1 LEFT JOIN 
    PriceRuleDetail PRD2 ON PRD2.Sku = Stock.Sku 
         AND PRD2.PriceRule = 'RRP' 
         AND PRD2.Quantity = 1 
WHERE StockCategoryMemberList.CategoryCode = 'FIRE' 
+0

나는 이것이 모든 대답 중에서 가장 빠른 것으로 밝혀졌으며 확실히 읽을 만합니다. 모두에게 감사드립니다. – Schodemeiss

+0

더 빨랐어 요 ... 텍스트 편집기에서 같은 요청을 받았습니다. – Arno

6

, 그것은 단일 쿼리 확인 :

SELECT 
    Stock.*, 
    PRD1.RuleValue as Price, 
    PRD2.RuleValue as WasPrice 
FROM 
    Stock, 
    StockCategoryMemberList, 
    PriceRuleDetail PRD1, 
    PriceRuleDetail PRD2 
WHERE 
StockCategoryMemberList.Sku = Stock.Sku 
AND StockCategoryMemberList.CategoryCode = 'FIRE' 
AND PRD1.Sku = Stock.Sku 
    AND PRD1.PriceRule = 'RG' 
    AND PRD1.Quantity = 1 
AND 
    PRD2.Sku = Stock.Sku 
    AND PRD2.PriceRule = 'RRP' 
    AND PRD2.Quantity = 1 

나는 당신이 만든 같은 가정 (즉, 하나 개의 재고 레코드에 대해 하나의 가격과 하나 WasPrice있다)했다. 그렇지 않은 경우 ... 쿼리가 정상이 아닙니다. 너도 마찬가지야.

+0

이것은 실제로 행 수가 조금 늘어나지 만 훨씬 더 읽기 쉬운 쿼리라고 생각합니다. – antik

+0

고마워요! 고유 키 설정 및 '수량 = 1 명세서'로 인해 PriceRuleDetail 테이블에 가격 레코드가 하나만있을 수 있습니다 (밴드로 다른 수량 설정에 따라 가격이 다를 수 있음). 이것은 내 것보다 훨씬 좋아 보입니다. 감사합니다. – Schodemeiss

+0

WasPrice (또는 Price)가 없으면 특정 주식을 반환하지 않습니다. –

0

실제로 길이를 늘리고 Stock. *을 사용하지 말고 각 열 이름을 사용하는 것이 좋습니다. *를 사용할 때 테이블을 쿼리하여 열 이름을 가져와야하며 조금 느립니다. 당신은 왼쪽을 사용할 수 있습니다

2
select s.*, prd1.rulevalue as price, prd2.rulevalue as wasprice 
from 
    stock s 
    inner join stockcategorymemberlist scm 
     on s.sku = scm.sku 
    inner join priceruledetail prd1 
     on prd1.sku = s.sku and prd1.pricerule='RG' and prd1.quantity=1 
    inner join priceruledetail prd2 
     on prd2.sku = s.sku and prd2.pricerule='RRP' and prd2.quantity=1 
where 
    s.categorycode='FIRE' 

이것은 또한 빨리 당신이 테이블의 각 행에 대해 하위 선택을 각각 수행 할 필요가 없습니다으로 될 것입니다.

관련 문제