2009-12-14 43 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 2009-12-14 13:10:59

+0

你已經更快了......我的文本編輯器中有相同的請求。 – Arno 2009-12-14 13:11:05

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 2009-12-14 12:57:16

+0

謝謝! 由於唯一的按鍵設置和「數量= 1聲明」(因爲可以爲頻段設置不同的數量,因此可能存在不同的價格),PriceRuleDetail表格中只能有一個Price和One是價格記錄。 這看起來比我的好多了! 謝謝! – Schodemeiss 2009-12-14 12:59:53

+0

如果沒有WasPrice(或Price),則不會返回特定的庫存。 – 2009-12-14 13:02:13

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' 

這也將更快,你就不必執行每個子選擇的對錶中的每一行。