- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个创建排序字典的查询(排序是因为有一个增量 id
来标识键的相对位置)。
然后我想知道,对于每一行,value
是否作为 key
存在于字典后面的任何其他行中。我正在使用 CROSS APPLY
中的相关查询来执行此操作。实际上是 CTE 上的 self 加入。
据我了解,这意味着表示 Dictionary 的 CTE 必须计算两次?
除了使用表变量(它在函数内部),还有其他建议吗?
WITH
dictionary([id], [key], [val]) AS
(
SELECT 1, 'a', 'b'
UNION ALL SELECT 2, 'b', 'c'
UNION ALL SELECT 3, 'c', 'a'
UNION ALL SELECT 4, 'x', 'w'
UNION ALL SELECT 5, 'y', 'x'
UNION ALL SELECT 6, 'z', 'y'
)
SELECT
*
FROM
dictionary dict
CROSS APPLY
(
SELECT COUNT(*) FROM dictionary WHERE dictionary.id > dict.id AND dictionary.[key] = dict.[val]
)
lookup(hits)
CROSS APPLY
(
SELECT 1, 3 WHERE lookup.hits = 0
UNION ALL
SELECT 1, 2 WHERE lookup.hits > 0
UNION ALL
SELECT 2, 3 WHERE lookup.hits > 0
)
map([from], [to])
-- [key]s 'c', 'x', 'y' and 'z' should only have one output rows
-- It's "acceptable" for only 'z' to have just one output row IFF a self join can be avoided
我能想到的其他选项都是自连接的变体......
dictionary dict
LEFT JOIN
(
SELECT key, MAX(id) AS id FROM dictionary GROUP BY key
)
lookup
ON lookup.key = dict.value
AND lookup.id > dict.id
或者...
dictionary dict
OUTER APPLY
(
SELECT 1 WHERE EXISTS (SELECT * FROM dictionary WHERE dictionary.id > dict.id AND dictionary.key = dict.value)
)
lookup(hits)
但是,我正在尝试避免 CTE 的自连接,可能是我没有想到的窗口函数?任何只是为了避免 CTE 被计算两次的东西......
(忽略 lookup.id > dict.id
方面很好,如果这意味着避免自连接...)
编辑: 添加了更完整的示例,还有一个 SQL Fiddle,感谢@MartinSmith 指出了一些不一致之处...
http://sqlfiddle.com/#!6/9eecb7db59d16c80417c72d1e1f4fbf1/17407
最佳答案
这是您可以使用窗口函数的一种方法。
首先将行反透视,使键和值成为通用项
,然后使用MAX ... OVER (PARTITION BY term)
找到最高行的 id该术语用作键的位置。
在这个例子中,它然后设置一个标志并丢弃由反透视添加的重复行(保留 context = 'v'
行,因为这是具有标志)。
然后您可以使用它来加入包含您的 map
值的表值构造函数。
WITH dictionary(id, [key], value)
AS (
SELECT 1, 'a', 'b'
UNION ALL SELECT 2, 'b', 'c'
UNION ALL SELECT 3, 'c', 'a'
UNION ALL SELECT 4, 'x', 'w'
UNION ALL SELECT 5, 'y', 'x'
UNION ALL SELECT 6, 'z', 'y'
),
t1
AS (SELECT dict.*,
context,
highest_id_where_term_is_key = MAX(CASE
WHEN context = 'k'
THEN v.id
END) OVER (PARTITION BY term)
FROM dictionary dict
CROSS APPLY (VALUES(id, [key], 'k'),
(id, value, 'v')) v(id, term, context)),
t2
AS (SELECT *,
val_in_later_key = CASE
WHEN id < highest_id_where_term_is_key
THEN 1
ELSE 0
END
FROM t1
WHERE context = 'v'
-- Discard duplicate row from the unpivot - only want the "value" row
)
SELECT id,
[key],
value,
highest_id_where_term_is_key,
map.[from],
map.[to]
FROM t2
JOIN (VALUES (1, 3, 0),
(1, 2, 1),
(2, 3, 1) ) map([from], [to], [flg])
ON map.flg = t2.val_in_later_key
ORDER BY id
返回
+----+-----+-------+------------------------------+------+----+
| id | key | value | highest_id_where_term_is_key | from | to |
+----+-----+-------+------------------------------+------+----+
| 1 | a | b | 2 | 1 | 2 |
| 1 | a | b | 2 | 2 | 3 |
| 2 | b | c | 3 | 1 | 2 |
| 2 | b | c | 3 | 2 | 3 |
| 3 | c | a | 1 | 1 | 3 |
| 4 | x | w | NULL | 1 | 3 |
| 5 | y | x | 4 | 1 | 3 |
| 6 | z | y | 5 | 1 | 3 |
+----+-----+-------+------------------------------+------+----+
关于sql - 希望删除 CTE 上丑陋的自连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48052258/
对于我不断地用刽子手问题来打扰这个论坛,我深表歉意。我希望很快就能完成这件事。确实在这方面一直在努力。这是到目前为止我的代码: #include #include #include #defin
这篇文章是 this one 的延续. 我试图了解我是否是唯一一个错过并需要 .NET 泛型类型继承其泛型参数类型之一的能力的人。 面临的挑战是收集支持此功能的令人信服的理由,或者,要知道没有。 我给
我正在使用下面的代码设计一个 3 小时的 JavaScript 倒计时 var count = 10800; var counter = setInterval(timer, 1000); //1
我正在处理验证并放置一个 html 模式属性,并希望在不点击保存/提交按钮的情况下查看错误消息。当我在字段外单击时,它应该根据我的模式条件进行验证。 这是我的代码: Extra Credit Da
我有一个像这样的 mysql 表结构: id int primary key name varchar start_time float 数据可能是这样的: id name
我试图在桌面上保留一张带有描述的图片,然后在移动设备上希望图片在左边,描述在右边……更多的是尽可能让所有内容都在首屏。 我希望桌面上的 DIV 是: 一个一个 BBB 但是在手机上: A B A B
我通过 Stackoverflow 进行了搜索,发现很多人试图避免 CSS 列中的重叠,但实际上我被要求让文本和图像重叠。 更新: 更好的图像解释了我被要求做的事情,以及指向我正在使用的代码的链接。谢
我在我的框架中设置了几个协议(protocol)来处理资源。在其中一个协议(protocol)中,我设置了一个扩展来为 decode 函数提供默认实现。显示代码和发生的情况更简单(请参阅对 fatal
我想同时加载,或者在上面的图像之后立即加载。它会在图像和标题 div 在预加载器内旋转之前不断加载 - 不好!这是 HTML: ✕ Various inv
我目前正在开发一个小游戏。我使用 getKeyCode 来移动我的角色,但问题是我不希望你在按住按钮的情况下能够继续移动。无论如何,我是否可以使用 getKeyCode 仅在第一次单击时注册,然后在释
我需要设置 width 或 max-width 才能让 margin:auto 工作,对吗? Like in this jsFiddle . 问题是,段落宽度等于 max-width,因此文本 blo
您好,我在同一页面上有一个表单和一个 Paypal 订阅按钮。在重定向到 Paypal 付款之前,我想在单击提交表单(通过电子邮件发送给我)时订阅按钮。 > >
我想让用户在点击一个文本字段时感觉就像我们点击一个按钮,在释放按钮后它会在很短的时间内变成橙色,然后闪烁并再次变成它的第一种颜色。当我点击它时它运行良好但没有出现颜色闪烁。 布局文件 主要 Ac
我怎样才能让我的 MediaPlayer 继续播放,即使在手机锁定和屏幕关闭的情况下,我认为它可能必须做一些使其成为服务但不确定的事情。如果是这样,我该如何将其更改为服务,或者是否有更快更简单的修复方
有人可以帮助我理解内存泄漏的概念以及特定数据结构如何促进/防止它(例如链表、数组等)。前段时间我被两个不同的人教过两次——由于教学方法的不同,这让我有点困惑。 最佳答案 维基百科有一个 good de
我希望 HTML 表单在提交后不执行任何操作。 action="" 不好,因为它会导致页面重新加载。 基本上,我希望在按下按钮或有人在输入数据后点击 Enter 时调用 Ajax 函数。是的,我可以删
我正在执行一个程序 say A from another,首先是 fork-ing,然后是 execve()。现在的问题是我希望 A 使用我通常使用 LD_PRELOAD 来完成的库。我如何在 exe
我目前正在为我们公司测试 Autofac。 我们希望有以下规则: 如果接口(interface)只实现了一次,则使用 builder.RegisterAssemblyTypes 自动添加它(见下文)。
正如 Scott Meyers 和 Andrei Alexandrescu 在 this 中概述的那样文章 简单尝试实现双重检查锁定实现在 C++ 中特别是不安全的,并且通常在不使用内存屏障的多处理器
目前我有一些代码可以在点击时改变图像,但这段代码是在一个 php HTML 循环中所以事情变得棘手,点击一个开关会使每个故事的开关都激活,因为它是基于 CSS 运行的.如何让它们独立交换? $("
我是一名优秀的程序员,十分优秀!