更新Firebird中的选定行

时间:2018-07-13 06:31:59

标签: sql firebird

我想修改查询。现在看起来像这样

<input type="checkbox" id="myCheck"  onclick="myFunction()">

function myFunction() {
  // Get the checkbox
  var checkBox = document.getElementById("myCheck");
  // Get the output text
  var text = document.getElementById("text");

  // If the checkbox is checked, display the output text
  if (checkBox.checked == true){
    text.style.display = "block";
  } else {
    text.style.display = "none";
  }
}

现在它像数据库的1/3一样返回,并且我想将这些行的“ stan_zmiany”修改为3。由于我无法在Firebird中使用UPDATE FROM构造,所以我尝试了

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

但是它更改了所有行的“ stan_zmiany”,而不是第一个查询中选择的行,您知道如何解决此问题吗?

1 个答案:

答案 0 :(得分:1)

您存在的子查询是不相关的子查询,这意味着它不依赖于更新记录中的值。

相反,使用

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不满足该要求的记录。

这样,您在子查询中不需要左连接,并且条件EW_POLYLINE.ID = EW_OB_ELEMENTY.IDE使子查询与外部更新语句相关。

还要注意,它的形式与我在my answer to your previous question中提供的最后一个解决方案中的select语句类似。