2013-02-14 11 views
5

Próbuję wybrać inny zestaw wyników dla produktu w zależności od rodzaju produktu. Tak więc, jeśli mój produkt powinien być książką, chcę, aby wyszukiwał UPC i Artist dla normalnego produktu, te szczegóły są jednak nieistotne, a dla innego produktu chciałbym zupełnie inny zestaw wyników.WYBIERZ PRZYKŁAD KIEDY TO (WYBIERZ)

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 

nie jestem pewien, gdzie wezwę niewłaściwy

+0

Put SQL na skrzypcach - sqlfiddle.com –

Odpowiedz

0

Na początek pierwszy select ma 6 kolumn, a drugi ma 4 kolumny. Być może oba mają taką samą liczbę kolumn (dodawanie wartości null?).

6

można spróbować inny format rachunku przypadku

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

) 
END 
FROM Product 
WHERE Product.product_id = $pid 

Zobacz http://msdn.microsoft.com/en-us/library/ms181765.aspx aby uzyskać więcej informacji.

+2

Jest to bardzo złe dla wydajności. Powinieneś raczej użyć sprzężenia, w przeciwnym razie za każdym razem, gdy uruchomiona jest ta kwerenda, zrobi to inny wybór dla każdego wiersza. Bardzo drogie. Zobacz alternatywne rozwiązanie poniżej. –

0

skończyło się pozostawiając wspólnych właściwości z zapytań SELECT i co drugi zapytanie SELECT w dalszej części strony. Użyłem polecenia php IF, aby wywołać różne skrypty w zależności od pierwszego zapytania SELECT, skrypty zawierały drugie zapytanie SELECT.

5

Należy unikać używania zagnieżdżonych wybiera i chciałbym iść tak daleko, aby powiedzieć, że nigdy nie powinno się ich używać w rzeczywistej wybranej części wyciągu. Będziesz uruchamiał to zaznaczenie dla każdego zwracanego wiersza. To naprawdę kosztowna operacja. Raczej użyj złączeń. Jest o wiele bardziej czytelny, a wydajność znacznie lepsza.

W danym przypadku poniżej zapytanie powinno pomóc. Zwróć uwagę, że instrukcja case nadal istnieje, ale teraz jest to prosta operacja porównywania.

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 

Użyłem lewego sprzężenia, ponieważ nie znam logiki biznesowej.