1

次のクエリがあります

SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID IN (41,41)

アプリケーション コードの制限により、製品レコードを 2 回返す必要があります。

私は SQL にあまり詳しくないので、本当に行き詰まっています。製品ごとに単一のクエリを実行したくありません。

4

4 に答える 4

3

2回表示するには、次のようにします。

SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID IN (41)
UNION ALL
SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID IN (41)

演算子が行うことは、UNION本質的にあるクエリの結果をのクエリの結果に「追加」することです...したがって、あなたの場合、同じ正確な選択を「追加」して、最終結果ですべての行が2回複製されるようにします。


ただし、より複雑なクエリに対しておそらくやりたいことは、次を使用することCROSS JOINです。

SELECT P.PRICE, P.PRODUCT_ID 
FROM PRODUCT P 
INNER JOIN ...
INNER JOIN ...
CROSS JOIN
(
    SELECT NULL UNION ALL 
    SELECT NULL
) cj
WHERE P.PRODUCT_ID IN (41) AND ... AND ... AND ..

このように、行は副選択内の 's の数だけ複製され、メイン クエリのSELECT NULLand条件は 1 回だけ実行する必要があります。CROSS JOINJOINWHERE

を使用CROSS JOINする利点は、結合条件を評価する必要がないことです。2 つのデータ セット間のデカルト積を作成するだけです。

CROSS JOINすべての主要な操作の最後に を追加するだけでJOIN、データを手動で複製できます。

于 2012-07-11T10:54:58.617 に答える
3

これを試して::

SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID=41
UNION ALL
SELECT P.PRICE, P.PRODUCT_ID FROM PRODUCT P WHERE P.PRODUCT_ID=41
于 2012-07-11T10:55:33.533 に答える
1

別の方法 (UNION ALL内部レベルで使用)。複雑なクエリと組み合わせるのが簡単です(コメントで述べたように):

SELECT p.price, p.product_id
FROM 
        PRODUCT AS p 
    JOIN 
        ( SELECT 41 AS product_id
        UNION ALL
          SELECT 41
        ) AS selection
      ON p.product_id = selection.product_id ;
于 2012-07-11T11:02:17.987 に答える