SQL Server:更新查询不会更改任何内容,不会显示任何错误
我试图用同一个表中的值更新该表 我想要的是更改工作程序和客户端相同的行中的连接设置,并且更改的行连接设置在与同一工作程序和客户端的另一个连接结束后5分钟内开始 我首先创建了一个SELECT查询,它返回了需要更改的所有行SQL Server:更新查询不会更改任何内容,不会显示任何错误,sql,sql-server,Sql,Sql Server,我试图用同一个表中的值更新该表 我想要的是更改工作程序和客户端相同的行中的连接设置,并且更改的行连接设置在与同一工作程序和客户端的另一个连接结束后5分钟内开始 我首先创建了一个SELECT查询,它返回了需要更改的所有行 SELECT t.* FROM Table1 t WHERE EXISTS (SELECT 1 FROM Table1 WHERE worker = t.worker AND client = t.client
SELECT t.*
FROM Table1 t
WHERE EXISTS (SELECT 1 FROM Table1
WHERE worker = t.worker
AND client = t.client
AND t.SessionNo != SessionNo
AND t.[Connection setup] <= DATEADD(mi, 5, [Connection end])
AND t.[Connection setup] >= [Connection end])
例如:
第一个表是应该更改的行。正如您所看到的,有一列right time,显示了更新后他们应该具有的值
SessionNo worker Tag Start Ende Dauer Connection setup Connection end client right_time
1 424568 mh 09.01.2020 00:00:00 13:45 13:49 00:04 09.01.2020 13:45:00 09.01.2020 13:49:00 OBENAT1D0209 13:44
2 269650 mg 09.03.2020 00:00:00 10:25 10:47 00:21 09.03.2020 10:25:00 09.03.2020 10:47:00 OBENAT1D0117 10:24
3 280892 mg 09.03.2020 00:00:00 12:19 12:22 00:03 09.03.2020 12:19:00 09.03.2020 12:22:00 OBENAT1D0117 12:19
4 175250 mg 09.03.2020 00:00:00 13:12 13:13 00:01 09.03.2020 13:12:00 09.03.2020 13:13:00 ORTNERAT1D0001 13:04
5 332684 dg 09.05.2020 00:00:00 16:05 16:33 00:28 09.05.2020 16:05:00 09.05.2020 16:33:00 KILLYAT3D0102 15:57
但正如您在这里看到的,开始列仍然是相同的
SessionNo worker Tag Start Ende Dauer Connection setup Connection end client right_time
1 317045 mh 09.01.2020 00:00:00 09:29 09:38 00:09 09.01.2020 09:29:00 09.01.2020 09:38:00 AUMAAT1D0124 09:29
2 144035 sb 09.01.2020 00:00:00 11:09 11:27 00:18 09.01.2020 11:09:00 09.01.2020 11:27:00 OBENAT1D0231 11:09
3 437704 mh 09.01.2020 00:00:00 13:44 13:44 00:00 09.01.2020 13:44:00 09.01.2020 13:44:00 OBENAT1D0209 13:44
4 424568 mh 09.01.2020 00:00:00 13:45 13:49 00:04 09.01.2020 13:45:00 09.01.2020 13:49:00 OBENAT1D0209 13:44
5 219640 mh 09.01.2020 00:00:00 15:16 15:26 00:10 09.01.2020 15:16:00 09.01.2020 15:26:00 OBENAT1D0209 15:16
6 201023 mh 09.01.2020 00:00:00 16:29 16:35 00:06 09.01.2020 16:29:00 09.01.2020 16:35:00 OBENAT1D0209 16:29
7 236114 mg 09.03.2020 00:00:00 08:55 09:08 00:12 09.03.2020 08:55:00 09.03.2020 09:08:00 NULL NULL
8 271379 mg 09.03.2020 00:00:00 10:24 10:25 00:00 09.03.2020 10:24:00 09.03.2020 10:25:00 OBENAT1D0117 10:24
9 269650 mg 09.03.2020 00:00:00 10:25 10:47 00:21 09.03.2020 10:25:00 09.03.2020 10:47:00 OBENAT1D0117 10:24
10 290765 mg 09.03.2020 00:00:00 12:19 12:19 00:00 09.03.2020 12:19:00 09.03.2020 12:19:00 OBENAT1D0117 12:19
11 280892 mg 09.03.2020 00:00:00 12:19 12:22 00:03 09.03.2020 12:19:00 09.03.2020 12:22:00 OBENAT1D0117 12:19
12 538583 mg 09.03.2020 00:00:00 12:30 12:58 00:28 09.03.2020 12:30:00 09.03.2020 12:58:00 RATTAYAT1D0107 NULL
13 697202 mg 09.03.2020 00:00:00 13:04 13:08 00:04 09.03.2020 13:04:00 09.03.2020 13:08:00 ORTNERAT1D0001 13:04
14 175250 mg 09.03.2020 00:00:00 13:12 13:13 00:01 09.03.2020 13:12:00 09.03.2020 13:13:00 ORTNERAT1D0001 13:04
15 330580 dg 09.05.2020 00:00:00 15:57 16:05 00:08 09.05.2020 15:57:00 09.05.2020 16:05:00 KILLYAT3D0102 15:57
16 332684 dg 09.05.2020 00:00:00 16:05 16:33 00:28 09.05.2020 16:05:00 09.05.2020 16:33:00 KILLYAT3D0102 15:57
注意:在这种情况下,为了测试值,我将更改“开始”列而不是“连接启动”。您正在更新零行,原因是:
ON (t.SessionNo = t2.SessionNo)
...
AND t2.SessionNo <> t.SessionNo
因此,我假设在执行更新时,在输出窗口中也不会显示任何行受到影响。如果是这样,那是因为您的加入条件不正确。SELECT和UPDATE是相同的,与其用EXISTS将其作为SELECT写入,还不如用JOIN写入,确保返回数据,然后将其更改为更新。此外,在更新中,您在t.SessionNo=t2.SessionNo和t.SessionNo!=t2.1没有。t.SessionNo怎么能等于和不等于t2.SessionNo?不行。那我该怎么加入他们呢?因为没有其他唯一的值可用于连接。我是否应该使用不同的方法?与不使用连接一样,问题是t.SessionNo=t2.SessionNo与t.SessionNo=t2.SessionNo直接冲突;这两个条款不可能都是真的。如果t.SessionNo等于t2.SessionNo根据定义不等于t2.SessionNo。。。故意双重否定我是根据网上的一些调查结果进行调查的,我不太明白这一切到底应该如何运作。你的回答确实有帮助,但我有一个问题。当同一工作者与同一客户机有多个连接,并且所有连接都发生在它们之间不到5分钟的时间内时。我怎样才能让所有这些连接都有一个相同的开始呢?我在我的question@AmilaBečirović。这回答了您最初提出的问题。我建议您删除此问题的编辑,接受此答案,然后提出新问题。堆栈溢出不是一个帮助我解决问题的游戏。@GordonLinoff,我计划接受这个答案,正如你所说,它确实回答了最初的问题。我只是想问写答案的人是否知道我该如何完成这个额外的问题,因为他们已经很熟悉我的问题了。人们有时确实会有其他问题,我不是故意粗鲁……我只是想了解它是如何工作的,而不仅仅是复制/粘贴it@miwa_p . . . 我不是想让这个评论听起来很刺耳,只是一个事实陈述。对一个问题进行了一些修改,以澄清所问的问题——例如,我不想输出带有时间成分的日期。然而,您添加了一个全新的条件,这使它成为一个新问题。@GordonLinoff…您是对的,这是一个新问题。但在我写这篇文章的时候,我并不认为这是一个新的话题,更像是对原始q的一个小小的补充。从那以后,我发现它比我想象的更复杂,并且仍在寻找如何解决它。谢谢你为我澄清……下次我会尽量说得更具体一些
ON (t.SessionNo = t2.SessionNo)
...
AND t2.SessionNo <> t.SessionNo
UPDATE t
SET t.Start = t2.Start
FROM Table1 t
INNER JOIN Table1 t2 ON t.worker = t2.worker
AND t.client = t2.client
AND t.SessionNo <> t2.SessionNo
AND t.[Connection setup] <= DATEADD(mi, 5, t2.[Connection end])
AND t.[Connection setup] >= t2.[Connection end];