2013-02-20 78 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