问题标签 [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.
sql-server - SQL Server:基于 2 列查找集合的最有效方法
编辑:我意识到我问错了问题。我真正想问的是,“给定一组值[Column B]
,检查其中是否有一个值[Column A]
与所有集合匹配,而没有其他值。”
我不确定我想做的事情是否有正式名称,所以很难找到我的问题。
给定一个有 2 列和一个值列表的表,我想看看这个组合(并且只有这个组合)是否存在于表中。
例如,给定这个表(假设它是整个表):
并给出这个输入参数:
对于那套,我想退货12345
。所以,基本上,我想运行一个检查,看看是否有任何值[Column A]
与所有值相匹配[Column B]
,@columnBs
并且没有其他值。
如果没有[Column A]
作为起点的价值,我什至无法构思一个长形式的解决方案。
如果它有助于更好地概念化这一点,这是一个消息传递解决方案,其中:
[Column A]
表示线程的主键[Column B]
表示分配给线程的用户
因此,如果一组用户收到一条新消息,我想查看是否存在由所有用户提供的现有线程,@columnBs
而没有其他用户。
sql-server - 更新触发器不会更新基于集合的更新查询中的所有行
我有带有以下触发器的城市和国家表:
当我更新任何城市时,它应该在审核表中插入一行,显示“ID 为“任何 ID”的城市已被修改”。Cities 表与 Country 表具有外键关系 (Cities.CountryID = Country.ID)。
我期望 trCountryUpdate 做的是,当我更新 Country 行时,它应该将行插入到具有更新 Country ID 的所有城市的 Audit 表中。
但是,当我用 ID 1 更新 Country 的名称时,它应该在 Audit 表中插入 5 行,因为 CountryID 1 有 5 个对应的 Cities。但是,它总是插入 1 行。
请让我知道当更新 ID 为 1 的国家/地区时,应该如何将 5 行插入到国家 ID 为 1 的 5 个城市的审计表中。
PS:
postgresql - PostgreSQL 内联函数行为
我想知道是否有人可以确认 PostgreSQL 内联的预期行为?
在 Microsoft SQL 世界中,任何被确定为内联的函数都将在多行的单次迭代中使用(函数体本质上是注入到调用者语句中,使其基于集合 [One call] 而不是每个输入数据行的探针 [许多调用])。
我和我的团队正在努力在没有诸如 MSSQL 之类的 Profiler 的情况下证明这一点,但我们最终能够证明这一点,并发现我们认为内联的函数的迭代次数与它所经过的行数成正比运作。
我们通过在函数 (pg_sleep) 中引入有意等待来做到这一点,我们可以看到 N 秒的等待导致总执行时间为 Rows*N,即超过 6 行的输入,等待 1 秒等于 6 秒,等待 2 是 12,依此类推。
所以我们的问题是:
- PostgreSQL 中的内联是我们认为的那样吗(相当于 MSSQLs 内联函数 [Type='IF'])?
- 是否有一个分析工具能够清楚地显示这一点,就像 MSSQL 中的 Profiler 一样?
- 有没有我们可以查看的元数据标记来确认/否认我们的函数确实是可内联的?
sql-server - 可以将 SQL Select 语句转换为基于集合的选择吗?
我有一个创建和运行 SQL 查询的 SP。最终结果用于某些报告。这个查询虽然需要很长时间才能运行(大于 30 秒是很长的时间,有时会持续超过一分钟)。
我已经阅读了一些关于基于集合的查询的内容,但我不清楚这个特定的查询是否适合,或者是否有办法转换它。我读过的关于基于集合的大部分内容似乎都在谈论将循环更改为集合,例如这两个Programming SQL in a Set-Based Way和An Introduction to set-based vs procedural programming methods in T-SQL
查询最终看起来像这样:
它有点长,创建它的 SP 也更长,但这可以转换为基于集合的查询吗?
如果是这样,我将如何开始这样做?
更新
这是实际执行查询计划
sql-server - 当查询是分层的时,是否可以在 SQL 中替换游标?
我在 MsSQL 中有三个表来存储数据。
第一个是 Children 包含以下行 ID、Name、Age、FatherID、SchoolID
第二个包含他们父亲的数据,比如这个父亲ID、姓名、年龄
第三个是带有 SchoolID 和 SchoolName、Address 等的 School。
(关系是:多个孩子可以有同一个父亲,很明显:))
我要列出的是与给定 SchoolID 相关的所有家庭成员。
我知道一个基于游标的解决方案:
*Cursor 正在处理两个临时表,第一步将具有给定 schoolid 的孩子选择到一个临时表中(@tempfamilymembers)。
第二步是从该表中选择不同的fatherids 并将其保存到第二个临时表(@fatherids)。
然后,我将遍历这些fatherids 以将具有匹配fatherids 的父亲(来自@fatherids)插入到第一个临时表(@tempfamilymembers)中。
然后,我可以从@tempfamilymembers中选择所有来完成查询*
基于游标的解决方案太难了,而且相对较慢,而且我听说 while 循环显示出更好的性能,而基于集合的方法会更好。
我的问题是:我可以在不创建游标的情况下以某种方式实现这一目标吗? (即使他有多个孩子,我也只想列出此列表中出现的父亲一次。)
sql - 具有多个匹配项的基于 SQL Server 集的更新
我发现了这个问题,它提出了同样的情况。尝试进行基于集合的更新,并且要更新的表与表中用于更新值的多行匹配。一个最小的例子如下:
另一个问题的答案涉及获取特定更新值的方法。我想知道的是在上面的例子中,或者其他类似的情况下,SQL Server 如何决定哪个值是新值?第一行返回?还有什么?
sql - 如何将此迭代解决方案转换为基于集合的解决方案
提示:显示资产库存以及当前价值(每年减去 20% 的折旧)。还显示每个项目将完全折旧的年份。
基本上,我试图显示带有 PurchaseDate 的资产库存以及项目完全折旧的日期,资产每年折旧 20%。我尝试创建一个临时表并将一些资产表列复制到其中,然后为资产完全折旧的日期添加一列。
我使用迭代解决方案实现了这一点,但建议我在 SO 上发布以尝试使用基于集合的实现来执行此操作。我是 SQL 的新手,并且新了解到它是一种基于集合的语言,并且它不太适合迭代解决方案。
先感谢您!
sql - 从具有一组日期的缓慢变化的表中选择记录
我有一个缓慢变化的表,每次更改任何源字段时都会创建一个新行。添加了一些元数据以显示该版本何时有效。这是一个简化的示例(日期为 dd/mm/yyyy 格式),它不显示已更改的字段。
开始日期 | 结束日期 | 当前记录 | 唯一身份 | 序列号 |
---|---|---|---|---|
2020 年 15 月 12 日 | 2020 年 12 月 31 日 | 0 | 1 | 2345 |
2020 年 15 月 12 日 | 2021 年 8 月 3 日 | 0 | 2 | 1234 |
2020 年 9 月 19 日 | 15/2/2021 | 0 | 3 | 2345 |
2020 年 15 月 12 日 | 2021 年 8 月 3 日 | 0 | 4 | 3456 |
2021 年 9 月 3 日 | 2021 年 10 月 3 日 | 0 | 5 | 3456 |
16/2/2021 | 2021 年 10 月 3 日 | 0 | 6 | 2345 |
2021 年 9 月 3 日 | 26/3/2021 | 0 | 7 | 1234 |
27/3/2021 | 2021 年 2 月 5 日 | 0 | 8 | 1234 |
2021 年 11 月 3 日 | 2021 年 5 月 17 日 | 0 | 9 | 3456 |
2021 年 3 月 3 日 | 27/4/2021 | 0 | 10 | 4567 |
20/1/2021 | 2021 年 7 月 4 日 | 0 | 11 | 5678 |
2021 年 3 月 5 日 | 2021 年 6 月 30 日 | 1 | 12 | 1234 |
25/5/2021 | 2021 年 5 月 31 日 | 0 | 13 | 2345 |
2021 年 8 月 4 日 | 22/5/2021 | 0 | 14 | 5678 |
2021 年 1 月 6 日 | 26/6/2021 | 0 | 15 | 2345 |
2021 年 5 月 18 日 | 2021 年 3 月 6 日 | 0 | 16 | 3456 |
27/6/2021 | 2/8/2021 | 0 | 17 | 2345 |
28/4/2021 | 28/6/2021 | 0 | 18 | 4567 |
23/5/2021 | 2021 年 6 月 9 日 | 0 | 19 | 5678 |
2021 年 4 月 6 日 | 28/6/2021 | 0 | 20 | 3456 |
2021 年 6 月 29 日 | 25/7/2021 | 0 | 21 | 3456 |
2021 年 3 月 8 日 | 9999 年 12 月 31 日 | 1 | 22 | 2345 |
26/7/2021 | 9999 年 12 月 31 日 | 1 | 23 | 3456 |
2021 年 15 月 10 日 | 9999 年 12 月 31 日 | 1 | 24 | 4567 |
2021 年 7 月 9 日 | 2021 年 1 月 11 日 | 0 | 25 | 5678 |
22/9/2021 | 2021 年 10 月 11 日 | 0 | 26 | 6789 |
2021 年 2 月 11 日 | 2021 年 11 月 16 日 | 0 | 27 | 5678 |
2021 年 11 月 17 日 | 21/11/2021 | 0 | 28 | 5678 |
2021 年 7 月 15 日 | 9999 年 12 月 31 日 | 1 | 29 | 7891 |
22/11/2021 | 9999 年 12 月 31 日 | 1 | 30 | 5678 |
26/11/2021 | 9999 年 12 月 31 日 | 1 | 31 | 6789 |
2021 年 15 月 6 日 | 9999 年 12 月 31 日 | 1 | 32 | 8912 |
对于任何给定的时间点,每个序列号只有一条记录(即,相同序列号的日期范围不会重叠),但某些序列号的剧集之间可能存在间隔(表示在服务间隔后离开和返回的东西)。
我想提供任意日期时间列表,例如 2021 年 1 月 1 日、2021 年 3 月 15 日、2021 年 5 月 27 日午夜。2021 年 10 月 23 日。我想返回一组记录,其中包含在每个日期有效的每条记录,每一行都标有它被选中的日期。所以上面的例子应该返回这个。
日期 | 唯一身份 | 序列号 |
---|---|---|
2021 年 1 月 1 日 | 2 | 1234 |
2021 年 1 月 1 日 | 3 | 2345 |
2021 年 1 月 1 日 | 4 | 3456 |
15/3/2021 | 7 | 1234 |
15/3/2021 | 9 | 3456 |
15/3/2021 | 10 | 4567 |
15/3/2021 | 11 | 5678 |
27/5/2021 | 12 | 1234 |
27/5/2021 | 13 | 2345 |
27/5/2021 | 16 | 3456 |
27/5/2021 | 18 | 4567 |
27/5/2021 | 19 | 5678 |
2021 年 10 月 23 日 | 22 | 2345 |
2021 年 10 月 23 日 | 23 | 3456 |
2021 年 10 月 23 日 | 24 | 4567 |
2021 年 10 月 23 日 | 25 | 5678 |
2021 年 10 月 23 日 | 26 | 6789 |
2021 年 10 月 23 日 | 29 | 7891 |
2021 年 10 月 23 日 | 32 | 8912 |
我可以看到如何使用光标执行此操作,逐步将每个日期放入变量中并使用类似
获取行。
我无法制定出一种以基于集合的方法进行的模式。我首选的 SQL 版本是 TSQL。抱歉,这几乎可以肯定是重复的,但我找不到能打出有效示例的单词形式。