SQL Server中的运算符BETWEEN

时间:2013-02-20 06:38:34

标签: sql sql-server tsql sql-server-2008-r2 between

我在存储过程中编写子查询以获取存储为varchar数据类型的Orders之间的值。当我运行查询时,它显示:

  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

我搜索了一下,发现问题是因为在子查询中返回的值超过1。

但在我的情况下,我需要在给定输入之间的所有值。任何人都能告诉我我能以什么方式实现这一目标。

代码:

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'

1 个答案:

答案 0 :(得分:2)

BETWEEN不是BibContents抛出错误而是SELECT value上的一个子选择。

您有两个选择

  • 采取简单的路线,并使用SELECT TOP 1 value
  • 更改每个BibContents
  • 找到其中一个子选择返回多个记录的原因
    • 如果它不应该返回多个记录,则应该向PoDetails添加一个唯一约束,以防止这种情况发生。
    • 如果给定BibContents可能出现多条记录,则必须决定是否要返回。
    • 如果您想要返回所有这些内容,则必须将子选项更改为正确的连接。

我的建议是避免维护噩梦并解决根本原因。

为{{1}}制定另一个计划也不会受到伤害。看起来你已经采用了我认为是EAV model

bad idea.主题