web-dev-qa-db-ja.com

その後のケースの選択(選択)

製品タイプに応じて、製品の異なる結果セットを選択しようとしています。したがって、私の製品が本である場合、通常の製品の場合はUPCおよびArtistを検索する必要がありますが、これらの詳細は無関係です。

SELECT CASE Product.type_id
    WHEN 10 THEN (
        SELECT 
        Product.product_id, 
        Product.type_id, 
        Product.product_name, 
        Product.UPC,
        Product_Type.type,
        CONCAT_WS(' ' , first_name, middle_name, last_name ) AS artistC 
        FROM Product, Product_Type, Product_ArtistAuthor 
        WHERE Product.type_id = Product_Type.type_id 
        AND Product.product_id = $pid
        AND Product.artist_id = Product_ArtistAuthor.artist_id
    )
    ELSE (
        SELECT 
        Product.product_id, 
        Product.type_id, 
        Product.product_name,
        Product_Type.type 
        FROM Product, Product_Type 
        WHERE Product.type_id = Product_Type.type_id 
        AND Product.product_id = $pid
    )
END
FROM Product 
WHERE Product.product_id = $pid

どこが間違っているのかわかりません

7

あなたは、case文の他の形式を試すことができます

CASE WHEN Product.type_id = 10
THEN
(
  Select Statement
)
ELSE
(
  Other select statement

)  
END
FROM Product 
WHERE Product.product_id = $pid

詳細については、 http://msdn.Microsoft.com/en-us/library/ms181765.aspx を参照してください。

8
Kevin Kunderman

ネストされた選択の使用は避ける必要があり、ステートメントの実際の選択部分では使用しないでください。返される行ごとにselectを実行します。これは本当に高価な操作です。むしろ結合を使用します。それははるかに読みやすく、パフォーマンスははるかに優れています。

あなたの場合、以下のクエリが役立ちます。ケースステートメントはまだ存在しますが、今では単純な比較操作です。

select
    p.product_id,
    p.type_id,
    p.product_name,
    p.type,
    case p.type_id when 10 then (CONCAT_WS(' ' , first_name, middle_name, last_name )) else (null) end artistC
from
    Product p

    inner join Product_Type pt on
        pt.type_id = p.type_id

    left join Product_ArtistAuthor paa on
        paa.artist_id = p.artist_id
where
    p.product_id = $pid

ビジネスロジックがわからないため、左結合を使用しました。

5
Ryan-Neal Mes

最初の選択には6列があり、2番目の選択には4列があります。おそらく、両方の列の列数を同じにしてください(nullを追加しますか?)。

0
Ed Heal

最終的に、SELECTクエリの共通プロパティを残し、ページの後半で2番目のSELECTクエリを作成しました。 php IFコマンドを使用して、最初のSELECTクエリに応じて異なるスクリプトを呼び出しました。スクリプトには2番目のSELECTクエリが含まれていました。

0