UNION - MySQL vs SQLite

时间:2013-06-21 14:38:07

标签: mysql union

我有以下SQL-Query:

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_98中,但我从pricelist_10获取了行。

我很好奇为什么查询处理方式不同的技术背景。此外,我正在寻找一个单一查询解决方案,它也适用于我的SQLight数据库。

编辑另请注意,WHERE是可选的。我需要SELECT来返回我查询的至少一个价目表中的每个产品。

1 个答案:

答案 0 :(得分: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这样做,我会非常惊讶)。

如果您创建一个使用首选项参数实现联合的视图,则可能会提高效率。