-1

我有以下 SQL 查询:

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 来返回我查询的至少一个价格表中的每个产品。

4

1 回答 1

0

当您使用GROUP BY时,选择返回哪一行是任意的——除非您使用,否则 SQL 不会强加任何顺序ORDER BY。以下是明确指定首选项的方法:

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 这样做,我会感到非常惊讶)。

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

于 2013-06-21T14:58:09.423 回答