【发布时间】:2016-02-17 09:38:08
【问题描述】:
我需要从我的数据库中选择一些特定的位置,然后更新它们。
尴尬的是,在单独执行Select 语句时,它使用了 90k 行。
但是在对同一个 Select 执行 Update 语句时,它影响 80k 行。
这会产生 90k 行。
SELECT
"Extent2"."AppId",
"Extent2"."DateCreated"
FROM
"dbo"."Route" AS "Extent1"
INNER JOIN
"dbo"."Positions" AS "Extent2" ON
"Extent1"."BoundAppId" = "Extent2"."AppId" AND
"Extent2"."DateCreated" > "Extent1"."TimeStarted" AND
"Extent2"."DateCreated" < "Extent1"."TimeFinished"
WHERE
"Extent1"."TimeStarted" IS NOT NULL AND
"Extent1"."TimeFinished" IS NOT NULL AND
FALSE = "Extent1"."IsDeleted" AND
"Extent1"."TimeFinished" < '2016-02-06'
这会影响 80k 行 (嵌套的 Select 是相同的)
UPDATE "dbo"."Positions" AS j0
SET "ArchiveUntil" = '2020-02-16'
FROM (
SELECT
"Extent2"."AppId",
"Extent2"."DateCreated"
FROM
"dbo"."Route" AS "Extent1"
INNER JOIN
"dbo"."Positions" AS "Extent2" ON
"Extent1"."BoundAppId" = "Extent2"."AppId" AND
"Extent2"."DateCreated" > "Extent1"."TimeStarted" AND
"Extent2"."DateCreated" < "Extent1"."TimeFinished"
WHERE
"Extent1"."TimeStarted" IS NOT NULL AND
"Extent1"."TimeFinished" IS NOT NULL AND
FALSE = "Extent1"."IsDeleted" AND
"Extent1"."TimeFinished" < '2016-02-06'
) as j1
WHERE (j0."AppId" = j1."AppId" AND j0."DateCreated" = j1."DateCreated")
此 SQL 是从 EntityFramework.Extended Library Source Commit 分支(未与父级合并)生成的,但对我来说似乎很正常......
也许不是?
【问题讨论】:
-
一般而言,您应该不在
UPDATE语句的FROM子句中引用目标表。 SQL Server 需要这个,但是在 Postgres 中你不能这样做(除非你 do 打算自加入 - 我不认为你想要)。您的 SQL 生成器似乎不知道 Postgres 并生成了错误的 SQL。我认为你想要这样的东西:hastebin.com/osebabaqiz.sql -
是的,这是有道理的,考虑到我分叉的分支最初是从 SqlServer 语法到 Postgresql 的轻微修改。
-
嗯,我收到错误:缺少表“Extend1”第 4 行的 FROM 子句条目:WHERE“Extend1”。“BoundAppId”= j0。“AppId”当将“Extend1”重命名为 J1 查询运行时但仍更新 80k 行
标签: sql postgresql postgresql-9.3