0

我有一个 SQL 表,其中包含描述一系列 ID 的两列;这些范围需要与第二个表中特定 ID 列下的单元格进行比较 - 如果它在范围内,包括在内,第二个表的行将包含在返回中。

编辑:可用范围受用户提供的日期范围的限制。

我只熟悉SQL的基础知识;在我开始研究循环和预定义的表格函数之前,有人有什么建议吗?

SELECT * FROM [ADataBase].[dbo].[AFirstTable]
  WHERE [ALongIDNumber] <=
     (SELECT [StartOfIDRange] FROM [DHL].[dbo].[ASecondTable]
     WHERE [date] BETWEEN '2010-01-21' AND '2010-01-22')
  AND   [ALongIDNumber] >=
     (SELECT [EndOfIDRange] FROM [DHL].[dbo].[ASecondTable]
      WHERE [date] BETWEEN '2010-01-21' AND '2010-01-22')

目前,这会返回错误 Msg 512, Level 16, State 1, Line 2 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. ,我猜这是因为选择返回了几行而导致它起毛。

我研究过,遇到了一个类似的问题,唯一的答案是固定数量的范围。因为我在表格中查询范围,所以范围的数量会改变。

由于这种情况的性质,修改数据库是最后的手段。

谢谢你的帮助!

4

4 回答 4

0

从您的叙述中我真的不清楚,但我认为您可能正在寻找的是 Join 的概念:

SELECT * FROM
   [ADataBase].[dbo].[AFirstTable] first
       inner join
   [DHL].[dbo].[ASecondTable] second
       on
          first.[ALongIDNumber] between second.[StartOfIDRange] and second.[EndOfIDRange]
WHERE
   second.[date] BETWEEN '20100121' AND '20100122'

这将找到first适合任何 ID 值范围的行,这些 ID 值在second. 这确实意味着,如果第二个 ID 值的范围重叠,您可能会在结果集中收到多行,而first.

在我开始研究循环之前...

不。尽管有一些粗略的方法可以在 SQL 中执行循环,但你真的不应该去那里。SQL 背后的想法是您描述想要的结果,SQL 引擎会找出实现该结果的最佳方法(无论是在幕后、循环、创建哈希表、将项目溢出到磁盘等)。

于 2012-12-27T15:33:45.620 回答
0

这是一个简单的连接:

select st.*
from SecondTable st join
     FirstTable ft
     on st.id between ft.StartOfIdRange and ft.EndOfIdRange

您似乎对日期有附加条件。您没有在问题中解释它们,所以我不确定如何将它们合并到查询中。

我仔细阅读后发现日期在第一个表中。好吧,您可以在on子句或where子句中添加范围:

select st.*
from SecondTable st join
     FirstTable ft
     on st.id between ft.StartOfIdRange and ft.EndOfIdRange and
        ft.[date] BETWEEN '2010-01-21' AND '2010-01-22'

如果您有重叠的范围,您可能需要执行 adistinct来删除重复项:

select distinct st.*
于 2012-12-27T14:39:18.067 回答
0

假设2010-01-21and2010-01-22分别是最小和最大日期,您可以使用MIN()andMAX()函数在每个子查询中获取单个 ID:

SELECT * 
FROM [ADataBase].[dbo].[AFirstTable]
WHERE [ALongIDNumber] BETWEEN
(
    SELECT MIN(ID)
    FROM [DHL].[dbo].[ASecondTable]
)
AND
(
    SELECT MAX(ID)
    FROM [DHL].[dbo].[ASecondTable]
)
于 2012-12-27T14:40:22.507 回答
0

oracle有Between关键字来检查范围,请这样。关键字之间的示例

SELECT * FROM [ADataBase].[dbo].[AFirstTable]
      WHERE [ALongIDNumber] between
         (SELECT [StartOfIDRange] FROM [DHL].[dbo].[ASecondTable]
         WHERE [date] BETWEEN '2010-01-21' AND '2010-01-22')
      AND   
         (SELECT [EndOfIDRange] FROM [DHL].[dbo].[ASecondTable]
          WHERE [date] BETWEEN '2010-01-21' AND '2010-01-22')
于 2012-12-27T14:53:34.563 回答