-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 データベースでも機能する 1 つの単一クエリ ソリューションを探しています。

EDITまた、WHERE はオプションであることに注意してください。クエリを実行した少なくとも 1 つの価格表テーブルのすべての製品を返すには、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、サブクエリに句を入れることをお勧めします。それ以外の場合、データベースは、2 つの行をマージするだけでなく、検索を行う前にテーブル全体をマージする必要があります (理論的には、クエリ オプティマイザーがこの変換を自分で行うことができますが、MySQL や SQLite がこれを行った場合は非常に驚きます)。

設定パラメーターを使用してユニオンを実装するビューを作成すると、効率が向上する可能性があります。

于 2013-06-21T14:58:09.423 に答える