2013-06-21 71 views
-1

我有以下SQL查詢:UNION - MySQL的VS SQLight

SELECT * 
FROM (SELECT sku, 
       price 
     FROM pricelist_98 
     UNION 
     SELECT sku, 
       price 
     FROM pricelist_10) AS result 
WHERE sku = '5101863' 
GROUP BY sku 

我想從pricelist_98得到的價格當指定產品存在在那裏,否則從pricelist_10的價格。這應該可以動態擴展更多不同的價格表。應該顯示包含產品的第一個價格表。

當我查詢我的MySQL服務器時,我得到了意志結果。我還有一個在SQLight數據庫中具有相同數據庫結構的iPad應用程序。在這裏,我從pricelist_10那裏得到了該行,但是該產品存在於pricelist_98中。

我很好奇爲什麼查詢處理不同的技術背景。此外,我正在尋找一種在我的SQLight數據庫中也能工作的單一查詢解決方案。

編輯另請注意,WHERE是可選的。我需要SELECT來返回我查詢的至少一個價格表中的每個產品。

+1

誰創建了不同的價目表?你有沒有試過SQLDark? – Kermit

+0

這樣做的原因是因爲不同的客戶被分配到不同的價格表,並且一些價格表對於這個客戶沒有特價的產品有一個基準價格表。在這個例子中,pricelist_98只包含約10個產品,並且pricelist_10作爲基礎價目表。 這個結構是預設的,我不能改變任何事情。 不,我沒有嘗試SQLDark。我困在SQLight中。 – m0tv

+0

1. SKU在單個表格中是唯一的嗎? 2.爲什麼你使用GROUP BY? –

回答

0

當您使用GROUP BY時,返回哪一行的選擇是任意的 - 除非使用ORDER BY,否則SQL不會強加任何順序。以下是如何明確指定偏好:

SELECT main.sku, main.price 
FROM (SELECT sku, 
       price, 
       1 preference 
     FROM pricelist_98 
     WHERE <whatever> 
     UNION 
     SELECT sku, 
       price, 
       2 preference 
     FROM pricelist_10 
     WHERE <whatever>) AS temp1) AS main 
JOIN (SELECT sku, min(preference) preference 
     FROM (SELECT sku, 
        1 preference 
       FROM pricelist_98 
       WHERE <whatever> 
       UNION 
       SELECT sku, 
        2 preference 
       FROM pricelist_10 
       WHERE <whatever>) AS temp2 
     GROUP BY sku) AS temp3 
ON main.sku = temp3.sku AND main.preference = temp3.preference 

這也是更好地把WHERE子句中的子查詢。否則,數據庫必須在執行搜索之前合併整個表,而不是合併兩行(理論上查詢優化器可以自己完成這種轉換,但是如果MySQL或SQLite這樣做,我會感到非常驚訝)。

如果您創建一個實現具有首選項參數的聯合的視圖,則可能會提高效率。

+0

感謝您使用where子句提示。 但不幸的是我不能使用你的解決方案,因爲WHERE是可選的。我需要價格表中的每個產品,所以我不能使用LIMIT 1. – m0tv

+0

拿出去或將它移到外面。應該得到你想要的,它只是一個低效率 –

+0

修改查詢以適用於可匹配多個SKU的'WHERE'子句。或者你可以完全放棄它,並獲得整個價目表。 – Barmar