2013-02-14 19 views
5

製品の種類によって異なる製品の結果を選択しようとしています。 私の製品が書籍でなければならないが、通常の製品ではUPCとアーティストを検索したいが、これらの詳細は無関係であり、別の製品では全く異なる結果が欲しい。SELECT(選択)

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 

私は最初の選択は6列を有し、第2の4つの列があります開始するために間違った

+0

SQLをfiddle-sqlfiddle.comに入れてください。 –

答えて

0

をつもり場所を確認していません。おそらく、両方とも同じ数の列を持ちます(ヌルを追加しますか?)。

6

あなたは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を参照してください。

+2

これはパフォーマンス上非常に悪いことです。むしろ結合を使用する必要があります。そうしないと、この問合せを実行するたびに、各行に対して別の選択が行われます。本当に高価です。下記の別の解決方法をご覧ください。 –

0

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

5

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

あなたのケースでは、下記の質問が役に立ちます。 casesステートメントはまだ存在しますが、今は単純な比較操作です。

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 

私はビジネスロジックを知らないので、左結合を使用しました。

関連する問題