问题标签 [set-based]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - 避免 T-SQL 中的 While 循环
我需要制定一个每天晚上执行的预定工作。我已经完成了任务,但必须使用 While 循环。这让我感到“内疚”。我需要一些关于如何将此操作转换为基于集合的操作并提高性能的建议。
我的表看起来像(尽可能简化它):
我使用 while 循环的原因是检索相对于 PoolID 的 ContactID 值(作为一个组)。在临时表中存储不同的 poolID 值并在循环中获取这些 poolID 值。所以我的 While 循环循环通过 PoolID 的不同值(不是逐行循环遍历所有表)而且我正在执行更新操作,这可以证明如下:
我希望我能尽可能清楚地展示这种情况,因为我无法在这里写下所有的查询。
编辑评论: 忘了补充,阻止我更新整个表的是,PoolID 是上面的 FK。每个 PoolID 都有一个 Layer4ID,我正在根据 PoolID 的 Layer4 值对池中的每个 ContactID 进行一些计算(例如根据状态计算池中的每个联系人,并检查计数结果是否等于或大于它的 Pool 的 Layer4 值。编辑我的表格演示部分更清楚。
所以从上面可以看出,每个Pool都有一个Layer4ID。并且每个 Layer4 都有一些条件,在这种情况下,它们都是整数(ConditionValue1 表示要更新的 ContactID 的最小计数(我的意思是更新 T_POOL 表中的状态),而 ConditionValue2 表示每个联系人的当前日期过去的月数被视为有效。(以更新其状态)-从其自己的表中检索 ContactID 的创建日期。-
Edit2 在我的示例查询中添加了一些连接(忽略语法错误、分组等)
编辑3
我当前的查询如下所示:简单地说,这需要从 while 循环中“释放”,即消除 @PoolID 的使用。
sql-server - TSQL 插入一组行和相关行
我有 2 张桌子:
- 订单(带有身份订单 ID 字段)
- OrderItems(带有外键来指示订单 ID)
在存储过程中,我有一个需要复制的订单列表。有没有一种在没有游标的存储过程中执行此操作的好方法?
编辑:
这是在 SQL Server 2008 上。
该表的示例规范可能是:
存储的过程传递了一个“fred”的customerName,因此它试图克隆CustomerName =“fred”的所有订单。
举一个更具体的例子:
Fred 恰好有 2 个订单:
- 订单 1 的行号为 1,2,3
- 订单 2 的行号为 1、2、4、6。
如果表中的下一个身份是 123,那么我想创建:
- 使用第 1、2、3 行订购 123
- 使用第 1、2、4、6 行订购 124
sql-server-2008 - 如何找到字符串中最长的字母序列
我想找出字符串中最长的字母序列
例如在单词Honorificabcdwert
中,输出将是abcd
.
我该怎么做?
我的想法是获取 Ascii,然后计算序列,直到它在某个点中断。但我只能继续
在这之后我不知道该怎么办。为此或任何其他方式所需的帮助。
sql - 如何将循环转换为基于表的查询?
我有一个IDTable
包含一列的表,还有一个带有参数的ID
表值函数MyProcedure
。这个参数是我的专栏ID
。此函数返回一个表。我需要为 column 中的每个值调用此函数ID
。我有这样的代码:
我需要删除 while 循环并制作基于集合的替代方案。我该怎么做?
tsql - 是否允许在您正在更新的表中子选列值?
我正在创建一个存储过程来计算事务表中每个备件的移动平均成本 (MAC)。它是某种自动检查和修复每一行的 MAC。我正在使用基于集合的方法,因为我避免使用光标。
我的交易表有以下几列:
Transaction No -- 记录该行的交易编号 TransacType -- 交易类型值将是 BEG (Beginning Balance), ISS (for Issuance), 和 RR (for Received Stocks)
库存号 -- 产品编号
成本——库存编号的每单位成本
数量——交易的数量
MAC -- 移动平均成本
规则: - 如果事务是 RR,Sproc 将计算 MAC。- 随后所有 ISS 交易的成本将等于最新 RR 的 MAC。
样品表
我的移动平均成本公式:
我的 MAC 修复代码:
我的问题是 MAC 方程所需的变量(TotalISS、TotalRR、CurrentMAC)返回 NULL。
是否不允许在您正在更新的表中选择列值?或者我的解决方案本身有错误?我基于这个例子得出了我的解决方案 -这里。 我不想使用光标,所以我使用了这种方法。
请帮我。
sql - 试图避免 RBAR!如何将相关表上的插入关联为基于集合的操作?
假设一个模式包含以下表:
巴兹
FooTemplate(一个 Baz 可能有零到多个 FooTemplates)
BarTemplate(一个 FooTemplate 可能有零到多个 BarTemplate)
Foo(一个 Baz 可能有零到多个 Foo)
Bar(一个 Foo 可能有零到多个 Bar)
每天将执行一个存储过程来为已超过其下一代日期的关联实体Foo
生成Bar
实体。Baz
这个过程的第一部分看起来有点像这样:
我的问题是我现在可以执行什么语句来生成正确的Bar
实体并使它们与新创建的Foo
实体正确关联?
编辑:该过程将在运行 SQL Server 2005 的服务器上执行。
EDIT2:感谢大家的帮助。在仔细考虑了这些信息后,我选择了另一种解决方案。我已将 Foo 表中的主键更改为不再是自动生成的标识列,这样可以执行对临时表的中间插入以捕获相关的 FooTemplateID 以及 FooID
sql - 如何将此用于生成菜单层次结构的过程 SQL 代码转换为基于 SET 的方法?
我有一个 SQL Server 2008 R2 数据库表,其中包含以下格式的层次结构信息:
所需的层次结构输出是这样的:
注意:“日期”一词已从节点“11 月 18 日”中删除
- 编辑:仅输出唯一的父子节点,例如,只有一个“Project 1\Phase 1”节点,但有两个“11 月 20 日”节点:一个是“Training\20 November”,另一个是“Testing\ 11 月 20 日”。
- 编辑:对于 SID = 3 的所有节点,必须将时间添加到最后一个节点,例如“测试\11 月 20 日\15:00 光学”
- 编辑: menuPath 字段中包含的确切深度可能会有所不同。
我已经能够创建以下过程 SQL 查询来完成此操作,但是有人知道我如何将其转换为基于等效集合的方法吗?
我编写了这个 SQL 来从menuPath
列中提取层次结构信息。根据 SID 编号,MarketName
信息和Time
列也附加到此menuPath
,例如,如果 SID = 1,则仅MarketName
附加,但如果 SID = 3,则同时附加 theTime
和 the MarkeName
。
MarketID
仅添加到MarketName
节点的菜单表中。
下面是我正在使用的表架构和数据的示例:
tsql - 有条件地合并和聚合 T-SQL 中的相邻行
我有一个 100K 行的表,代表特定时间段内的销售额。通常这些周期至少有几个小时,但有时我们会得到一个只有几分钟的周期。这些微小的时期扰乱了下游报告,所以我想将它们与前一个时期合并。任何 30 分钟或更短的时间段都应与上一个时间段合并,并在各个时间段内汇总销售数据。长周期之间可能有零个、一个或多个后续短周期。数据中没有时间间隔——一个时期的开始总是与前一个时期的结束相同。
执行此合并的基于集合的好方法(没有光标!)是什么?
现有数据(简化)如下所示:
所需的输出如下所示:
不幸的是,我们仍在使用 SQL Server 2008 R2,因此我们无法利用 SQL Server 2012 中很酷的新窗口函数,这可能会使这个问题更容易有效地解决。
在 SQL 中合并相邻行中对类似问题进行了很好的讨论?. 我特别喜欢 PIVOT/UNPIVOT 解决方案,但我不知道如何使它适应我的问题。
sql-server - TSQL 更新语句 MS SQL Server 2008 R2
我有一张表要更新。要更新的值是数据表上 PK ID 的 FK。
数据表具有日期范围,并且正在更新的表具有出生日期字段(月、日、年)。我的 Update 语句可以遍历所有记录 RBAR(逐行排列)但我希望使用更多基于集合的解决方案。我已经尝试在 update 语句的 from 子句中使用 case 语句和表连接,但是关于这个问题的一些事情让我不知道如何处理它。这是表模式和我对更新语句的尝试
表 2 星座
尝试 1 和 2
感谢您的协助。