我有以下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来返回我查询的至少一个价目表中的每个产品。
答案 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这样做,我会非常惊讶)。
如果您创建一个使用首选项参数实现联合的视图,则可能会提高效率。