在 Firebird 中更新选定的行
Updating selected rows in Firebird
我想修改我的查询。现在看起来像这样
SELECT EW_POLYLINE.P0_X, EW_POLYLINE.P0_Y, EW_POLYLINE.ID, EW_POLYLINE.STAN_ZMIANY, a.IDE, EW_POLYLINE.ID_WARSTWY
FROM EW_POLYLINE
LEFT JOIN (
SELECT EW_OBIEKTY.STATUS
, EW_OB_ELEMENTY.IDE
, EW_OB_ELEMENTY.TYP
FROM EW_OBIEKTY
INNER JOIN EW_OB_ELEMENTY
ON EW_OBIEKTY.UID = EW_OB_ELEMENTY.UIDO
WHERE EW_OBIEKTY.STATUS = 0 AND EW_OB_ELEMENTY.TYP <> 1
) as a ON EW_POLYLINE.ID = a.IDE
WHERE EW_POLYLINE.STAN_ZMIANY = 0 AND a.IDE Is Null
现在它 returns 相当于数据库的 1/3,我想将这些行的 "stan_zmiany" 修改为 3。因为我不能在 Firebird 中使用 UPDATE FROM 构造,所以我尝试了
update EW_POLYLINE
set stan_zmiany = 3
WHERE EXISTS (SELECT 1
FROM EW_POLYLINE
LEFT JOIN (
SELECT EW_OBIEKTY.STATUS
, EW_OB_ELEMENTY.IDE
, EW_OB_ELEMENTY.TYP
FROM EW_OBIEKTY
INNER JOIN EW_OB_ELEMENTY
ON EW_OBIEKTY.UID = EW_OB_ELEMENTY.UIDO
WHERE EW_OBIEKTY.STATUS = 0 AND EW_OB_ELEMENTY.TYP <> 1
) as a ON EW_POLYLINE.ID = a.IDE
where EW_POLYLINE.STAN_ZMIANY = 0 AND a.IDE Is Null)
但是所有行都会更改 "stan_zmiany",而不是在第一个查询中选择的行,您知道如何解决这个问题吗?
exists中的你的子查询是一个不相关的子查询,这意味着它不依赖于update中的记录中的值。
改为使用
update EW_POLYLINE
set stan_zmiany = 3
where EW_POLYLINE.STAN_ZMIANY = 0
and NOT EXISTS (
SELECT 1
FROM EW_OBIEKTY
INNER JOIN EW_OB_ELEMENTY
ON EW_OBIEKTY.UID = EW_OB_ELEMENTY.UIDO
WHERE EW_OBIEKTY.STATUS = 0 AND EW_OB_ELEMENTY.TYP <> 1
AND EW_OB_ELEMENTY.IDE = EW_POLYLINE.ID
)
请注意使用 not exists
而不是 exists
,因为您实际上想要更新 EW_POLYLINE
中 不 满足的记录那个要求。
这样子查询就不需要left join了,条件EW_POLYLINE.ID = EW_OB_ELEMENTY.IDE
使得子查询关联到外层更新语句
另请注意,这与我在 中提供的最后一个解决方案中的 select 语句具有相似的形式。
我想修改我的查询。现在看起来像这样
SELECT EW_POLYLINE.P0_X, EW_POLYLINE.P0_Y, EW_POLYLINE.ID, EW_POLYLINE.STAN_ZMIANY, a.IDE, EW_POLYLINE.ID_WARSTWY
FROM EW_POLYLINE
LEFT JOIN (
SELECT EW_OBIEKTY.STATUS
, EW_OB_ELEMENTY.IDE
, EW_OB_ELEMENTY.TYP
FROM EW_OBIEKTY
INNER JOIN EW_OB_ELEMENTY
ON EW_OBIEKTY.UID = EW_OB_ELEMENTY.UIDO
WHERE EW_OBIEKTY.STATUS = 0 AND EW_OB_ELEMENTY.TYP <> 1
) as a ON EW_POLYLINE.ID = a.IDE
WHERE EW_POLYLINE.STAN_ZMIANY = 0 AND a.IDE Is Null
现在它 returns 相当于数据库的 1/3,我想将这些行的 "stan_zmiany" 修改为 3。因为我不能在 Firebird 中使用 UPDATE FROM 构造,所以我尝试了
update EW_POLYLINE
set stan_zmiany = 3
WHERE EXISTS (SELECT 1
FROM EW_POLYLINE
LEFT JOIN (
SELECT EW_OBIEKTY.STATUS
, EW_OB_ELEMENTY.IDE
, EW_OB_ELEMENTY.TYP
FROM EW_OBIEKTY
INNER JOIN EW_OB_ELEMENTY
ON EW_OBIEKTY.UID = EW_OB_ELEMENTY.UIDO
WHERE EW_OBIEKTY.STATUS = 0 AND EW_OB_ELEMENTY.TYP <> 1
) as a ON EW_POLYLINE.ID = a.IDE
where EW_POLYLINE.STAN_ZMIANY = 0 AND a.IDE Is Null)
但是所有行都会更改 "stan_zmiany",而不是在第一个查询中选择的行,您知道如何解决这个问题吗?
exists中的你的子查询是一个不相关的子查询,这意味着它不依赖于update中的记录中的值。
改为使用
update EW_POLYLINE
set stan_zmiany = 3
where EW_POLYLINE.STAN_ZMIANY = 0
and NOT EXISTS (
SELECT 1
FROM EW_OBIEKTY
INNER JOIN EW_OB_ELEMENTY
ON EW_OBIEKTY.UID = EW_OB_ELEMENTY.UIDO
WHERE EW_OBIEKTY.STATUS = 0 AND EW_OB_ELEMENTY.TYP <> 1
AND EW_OB_ELEMENTY.IDE = EW_POLYLINE.ID
)
请注意使用 not exists
而不是 exists
,因为您实际上想要更新 EW_POLYLINE
中 不 满足的记录那个要求。
这样子查询就不需要left join了,条件EW_POLYLINE.ID = EW_OB_ELEMENTY.IDE
使得子查询关联到外层更新语句
另请注意,这与我在