2012-05-22 64 views
0

我試圖從兩個表中獲取產品和圖像的列表。當我加入他們的行列,並從產品表中的HasImage列中使用的情況下開關,我得到這個錯誤:SQL案例開關默認爲在空值上顯示佔位符圖像

錯誤:

Subquery returned more than 1 value. 
This is not permitted when the subquery follows =, !=, <, <= , >, >= 
or when the subquery is used as an expression. 

當產品不具有的形象,我想取代它與默認圖像。

這裏是select語句:

SELECT 

P.[ProductId] 
,P.[ProductName] 

--If HasImage is false show the default.jpg 
,Case P.[HasImage] 
WHEN 'True' THEN (Select I.[FileName] as ProductImage FROM [ProductImages] I 
INNER JOIN [Product] P on P.ProductId = I.ProductId 
    WHERE I.Sequence=0) 
WHEN 'False' THEN 'default.jpg' 
END 

FROM [Product] P 
LEFT JOIN [ProductImages] I 
on P.ProductId = I.ProductId 

的問題是在當 '真'。這就是拋出錯誤的原因。

產品表

ProductId   ProductName  HasImage 
1     Coffee Mug  True 
2     Pen    False 
3     Pencil   False 

產品照片表

ProductId   Sequence   FileName 
1     0     Mug_Image1.jpg 
1     1     Mug_2.jpg 
1     2     Mug_Img3.jpg 

存在用於產品編號= 1的多個圖像,但我用序列= 0至只有一個返回。

返回的數據我想應該是這樣的:

ProductId   ProductName  ProductImage 
1     Coffee Mug  Mug_Image1.jpg 
2     Pen    default.jpg 
3     Pencil   default.jpg 

我已經試過COALESCE(NULLIF,左聯接和不同statments,但我還沒有得到這三種產品都顯示爲各種組合期望。

+0

你能嘗試LIMIT 1(或TOP 1,取決於DBMS)子句中你內心的查詢? –

+0

是的,工作。我必須在頂部添加一個DISTINCT。這就是訣竅! SELECT DISTINCT \t P.的[ProductID] ,P。[產品名稱] ,案例P. [HasImage] 如果 '真',那麼(選擇TOP 1 I. [文件名]作爲ProductImage FROM [ProductImages]我 INNER JOIN [Product] P on P.ProductId = I.ProductId WHERE I.Sequence = 0) WHEN'False'THEN'default。jpg' END FROM [Product] P LEFT JOIN [ProductImages] I on P.ProductId = I.ProductId – User970008

+1

它似乎只是在工作。 @Juniad說得沒錯,但是你再次添加了'INNER JOIN [Product] P'並將'WHERE P.ProductId = I.ProductId'轉換爲On子句。您的子查詢會返回錯誤的圖像,因爲它沒有連接到外部查詢,特別是'FROM [Product] P'。您還需要從外部查詢中移除LEFT JOIN ProductImages,因爲您沒有從中獲取任何內容,並且因爲它複製了Product中的記錄。然後你可以刪除不同的。 –

回答

1

除了下面OP我的意見,這是一個查詢,我相信應該已經寫在首位。

SELECT 
    P.[ProductId] 
    ,P.[ProductName] 
    --If HasImage is false show the default.jpg 
    ,Case P.[HasImage] 
     WHEN 'True' 
     THEN I.[FileName] 
     WHEN 'False' 
     THEN 'default.jpg' 
    END 
    FROM [Product] P 
    LEFT JOIN [ProductImages] I 
    ON P.ProductId = I.ProductId 
    -- Filter Sequence 0 only 
    -- All products will be retrieved 
    -- whether they have associated Image with Sequence = 0 
    AND I.Sequence = 0 

過濾左連接的右側允許您保留左連接的屬性並僅連接感興趣的行。如果HasImage僅用於標記圖像的存在而不是作爲商業規則(顯示/不顯示此特定產品的圖像),則可以刪除此案例以支持簡單的isnull(I.FileName, 'default.jpg')

或者(SQL Server 2005和更新),您可以使用CROSS APPLY檢索圖片:

SELECT 
    P.[ProductId] 
    ,P.[ProductName] 
    ,I.[FileName] 
    FROM [Product] P 
OUTER APPLY 
(
    SELECT CASE P.[HasImage] 
      WHEN 'True' 
      THEN ProductImages.[FileName] 
      WHEN 'False' 
      THEN 'default.jpg' 
     END FileName 
     FROM [ProductImages] 
    WHERE P.ProductId = ProductImages.ProductId 
     AND I.Sequence = 0 
) I 
0

爲什麼你想去一個INNER JOIN

如果你確信當HasImage爲TRUE您的表將有一個圖像,然後更好地去爲一條直線連接。

嘗試此查詢 -

SELECT P.[ProductId], 
     P.[ProductName], 
     Case P.[HasImage] 
      WHEN 'True' THEN 
      (Select 
        TOP 1 -- For Oracle 
        I.[FileName] as ProductImage FROM [ProductImages] I 
      WHERE P.ProductId = I.ProductId 
      ORDER BY I.Sequence 
      LIMIT 1 -- For MySQL 
      ) 
      WHEN 'False' THEN 'default.jpg' 
     END 
FROM [Product] P 
+0

不,它說'LIMIT'附近的語法不正確。我確實也修正了Order by I.Sequence錯誤。 – User970008

+0

你在用什麼?限制1是針對MySQL的。嘗試TOP 1. – JHS

+0

它工作?我編輯了我的答案。 – JHS

相關問題