製品タイプに応じて、製品の異なる結果セットを選択しようとしています。したがって、私の製品が本である場合、通常の製品の場合は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
どこが間違っているのかわかりません
あなたは、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 を参照してください。
ネストされた選択の使用は避ける必要があり、ステートメントの実際の選択部分では使用しないでください。返される行ごとに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
ビジネスロジックがわからないため、左結合を使用しました。
最初の選択には6列があり、2番目の選択には4列があります。おそらく、両方の列の列数を同じにしてください(nullを追加しますか?)。
最終的に、SELECTクエリの共通プロパティを残し、ページの後半で2番目のSELECTクエリを作成しました。 php IFコマンドを使用して、最初のSELECTクエリに応じて異なるスクリプトを呼び出しました。スクリプトには2番目のSELECTクエリが含まれていました。