【发布时间】:2017-10-12 11:54:13
【问题描述】:
我希望我的 Cross Apply 删除已加入的记录,而不考虑将其加入其他记录。是否有可能在一个声明中做到这一点?
所以在下面的示例中,期望的结果是第二条记录的 MatchID = 1,因为 B.recordID = 2 已经被第一条记录占用。我相信示例代码会说清楚:
http://sqlfiddle.com/#!6/555a1/5/0
因此,总而言之,如果将表 B 中的记录用作匹配项,我需要不再将它们视为可用。
EDIT1:添加示例代码:
构建架构:
CREATE TABLE A
(
id int,
eventName varchar(80),
startdateTime datetime,
duration int,
MatchedID int NULL
)
CREATE TABLE B
(
id int,
eventName varchar(80),
startdateTime datetime,
duration int
)
INSERT INTO A
SELECT 1, 'e1', dateadd(day, -1, getdate()), 5, NULL
UNION
SELECT 2, 'e1', dateadd(hour, -1, getdate()), 5, NULL
INSERT INTO B
SELECT 1, 'e1', dateadd(day, -1, getdate()), 4
UNION
SELECT 2, 'e1', dateadd(hour, -1, getdate()), 5
查询:
UPDATE toUpdate
SET toUpdate.MatchedID = Tbtmp.id
FROM A toUpdate
CROSS APPLY (SELECT TOP(1) *
FROM B WHERE toUpdate.eventName = B.eventName
ORDER BY ABS(toUpdate.Duration - B.Duration)) Tbtmp;
SELECT * FROM A
结果:
| id | eventName | startdateTime | duration | MatchedID |
+----+-----------+--------------------------+----------+-----------+
| 1 | e1 | 2017-10-11T11:34:15.083Z | 5 | 2 |
| 2 | e1 | 2017-10-12T10:34:15.083Z | 5 | 2 |
预期结果(第二条记录的 MatchedID 应该为 1,因为 2 已被使用,即使更接近原始记录)
| id | eventName | startdateTime | duration | MatchedID |
+----+-----------+--------------------------+----------+-----------+
| 1 | e1 | 2017-10-11T11:34:15.083Z | 5 | 2 |
| 2 | e1 | 2017-10-12T10:34:15.083Z | 5 | 1 |
【问题讨论】:
-
您应该将代码和示例数据放入您的问题中。该问题不应依赖于外部网站来理解。
-
预期结果?以及相同的详细解释。
-
@AnkitBajpai 预期结果已添加。谢谢
-
@GordonLinoff 添加了代码和示例数据。谢谢
标签: sql sql-server