【问题标题】:While Loop for 100 numbersWhile循环100个数字
【发布时间】:2016-08-05 04:02:27
【问题描述】:

我想创建 SQL While 循环,我可以在其中基于 12 位数字和两个列范围内提取数千个字段。例如,

如果我在一个表中有 3 列

MasterKeyNumber---BB000Q000000
StartingNumber BB0000000001
EndingNumber - BB000Q00000022

我想创建一个 while 循环,它将从起始和结束数字中提取所有数字,并显示哪个也将显示 MasterKey 数字

例如,

MasterKeyNumber---BB000Q000000
StartingNumber BB0000000001
StartingNumber BB0000000002
StartingNumber BB0000000003
StartingNumber BB0000000004
StartingNumber BB0000000005
StartingNumber BB0000000006
StartingNumber BB0000000007
StartingNumber BB0000000008
StartingNumber BB0000000009
StartingNumber BB0000000010
StartingNumber BB0000000011
StartingNumber BB0000000012
StartingNumber BB0000000013
StartingNumber BB0000000014
StartingNumber BB0000000015
StartingNumber BB0000000016
StartingNumber BB0000000017
StartingNumber BB0000000018
StartingNumber BB0000000019
StartingNumber BB0000000020
StartingNumber BB0000000021
StartingNumber BB0000000022

EndingNumber - BB000Q00000022

我只能通过使用“Between”“AND”之类的语句来提取一个或两个范围,但是如果我有显示多个不同数字和多个不同范围的范围,我该怎么做?

例如,我的查询一次拉一个范围

Select MasterKey, StartingNumber, EndingNumber, from TabelName
where StartingNumber Between 'BB0000000001' AND 'BB0000000022'

它只给出这个范围,但我有数千个不同的数字,它们将有多个范围,如 BB00000000004 到 BB00000000010、BB0000000045 到 BB0000000066、BB0000000088 到 BB0000000099

获取所有范围的 while 循环查询应该是什么?

提前致谢

【问题讨论】:

  • 如果您要查找的范围没有押韵或理由,那么循环会为您做什么,而您无法使用多个 SELECT 语句来做?我的意思是,你不必输入“多个不同的数字和多个不同的范围”吗?
  • 我可以编辑循环并将循环查询应用于我拥有的数千个其他项目!

标签: sql database stored-procedures while-loop sql-query-store


【解决方案1】:

如果您以循环和诸如此类的形式考虑 SQL 查询,您最终会陷入很多死胡同。而是考虑数据集及其相互之间的关系。

考虑获取所有要返回的范围:

SELECT masterkey, startingnumber, endingnumber FROM tablename;

现在我们有了要查询的每个开始和结束编号。我们现在想要获取出现在该范围内的所有起始数字,它是主密钥。所以:

SELECT
    tablename.masterkey,
    tablename.startingnumber,
    myRanges.startingNumber,
    myRanges.endingNumber
FROM
    (SELECT masterkey, startingnumber, endingnumber FROM tablename) myRanges
    INNER JOIN tablename ON
        tablename.startingnumber BETWEEN myRanges.StartingNumber and myranges.EndingNumber

这里使用初始查询设置开始和结束范围以再次查询表。我们返回您感兴趣的 masterkeystartingnumber,然后返回 startingnumberendingnumber,这导致我们提取了这个特定的 startingnumber

【讨论】:

  • 非常感谢您的帮助,但我无法按照 FROM (SELECT masterkey, startingnumber, endingnumber FROM tablename) myRanges INNER JOIN tablename ON tablename.startingnumber BETWEEN myRanges.StartingNumber 和myranges.EndingNumber 当在其中插入起始号码和结束号码时,查询会不断重复拉取相同的号码
  • 您不是已经从表中的startingnumberendingnumber 中获取了您的开始和结束号码吗?这就像您想要从您的startingnumberendingnumber 派生的记录范围,但受起始编号和结束编号的限制。这是最后一个要求,我不知道如何将我的查询中的点与您的需求联系起来。
  • 除非我这样做 Select Tablename.MasterKey, TabelName.StartingNumber myRanges.StartingNumber, myRanges.EndingNumber, From (Select MasterKeyKey = 'B00000000020', StartingNumber = 'B0000000021', EndingNumber = 'B00005000530') myRanges INNER JOIN SameTableName ON dbo.SameTableName.StartingNumber Between 'B00000000020' and 'B000000000530' 这给了我每条记录的完整范围。
  • 但是您已经可以获得给定硬编码范围的完整集,这就是您在上面的问题中所做的。我的答案中编写的 SQL 将为您提供表中每个范围的完整范围,方法是将其连接回自身。你可以,在子查询中,如果你想限制masterkey返回的范围(例如)使用(SELECT masterkey, startingnumber, endingnumber FROM tablename WHERE masterkey = 'B00000000020') myRanges ...之类的东西现在使用任何具有该主键的“范围”,你将让它返回完整范围返回。
  • 哦,是的!是的!是的!现在它起作用了!非常感谢!我想我只是做错了我重新运行查询应用您的原始概念并且它有效。只有很多记录,它正在执行每一个记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 2019-03-08
  • 2016-04-24
相关资源
最近更新 更多