2013-02-20 29 views
1

我在存儲過程中編寫子查詢以獲取存儲爲varchar數據類型的Orders之間的值。當我運行查詢時,它顯示:SQL Server中的運算符BETWEEN

子查詢返回的值超過1。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

我GOOGLE了一下,發現問題,因爲在子查詢中返回多個值。

但在我的情況下,我需要所有在給定輸入之間的值。誰能告訴我有什麼辦法可以做到這一點..

代碼:

SELECT ROW_NUMBER()OVER(
         ORDER BY po.id) AS SNo , 
     pd.Copies AS Quantity, 
     pd.EstUnitPrice AS UniPrice, 
     pd.Copies*pd.EstUnitPrice AS Total, 

    (SELECT value 
    FROM BibContents 
    WHERE bibid=pd.BibId 
    AND sfld='a' 
    AND tagno='245') AS Title, 

    (SELECT value 
    FROM BibContents 
    WHERE bibid=pd.BibId 
    AND sfld='a' 
    AND tagno='020') AS 'ISSN/ISBN', 

    (SELECT value 
    FROM BibContents 
    WHERE bibid=pd.BibId 
    AND sfld='a' 
    AND tagno='100')AS Author 
FROM [VibrantMas].[dbo].[PoDetails] AS pd 
     INNER JOIN Porders AS po ON po.Id=pd.PoId 
WHERE po.No BETWEEN '000021' AND '000024' 
+2

告訴你什麼,你如何格式化你的TSQL很好... – 2013-02-20 06:39:31

+0

對不起,格式化查詢錯誤。 – UniqueChar 2013-02-20 06:44:17

回答

2

這不是拋出錯誤,但在BibContents的子選擇之一BETWEEN

你有兩個選擇

  • 採取簡單的方法,並改變每個SELECT valueSELECT TOP 1 value
  • 去的根本原因,爲什麼這些子選擇之一返回多個記錄
    • 如果它不應該返回多個記錄,則應該在BibContents上添加一個唯一約束,以防止這種情況發生。
    • 如果對於給定的PoDetails可能會發生多條記錄,則必須決定是否希望返回。
    • 如果你想讓他們全部返回,你必須改變子選擇到適當的連接。

我的建議是將自己從維護的噩夢保存和解決的根本原因。

制定出BibContents的另一個方案也不會傷害。它看起來像你採用EAV model主題至極,我認爲是bad idea.

+0

@Dhevy - 你最終使用了什麼解決方案? – 2013-02-20 07:49:05

+0

從PoDetails返回單個結果。 – UniqueChar 2013-06-04 05:09:20