PostgreSQL:更新前2行语法错误?

时间:2018-03-14 06:36:02

标签: sql postgresql

我正在尝试编写一个更新函数来更新前2个id,其中它是从不同表中所欠的最高总数的顺序,另一个条件是id为NULL,它应该匹配个人中的纳税人表

这是数据表的一个示例:

犯罪表:

IRSagentID | taxpayerid
-----------------------
     NULL  | 1 
     23hj23 | 2
     NULL  | 3

个人表

taxpayerid | totalTaxedOwed
---------------------------
         1 | 2
         5 | 44
         3 | 34

结果(应该是)

3 | 34    (ordered by cost in individual table)
1 | 2     (ordered by cost in individual table)

应该在3&在1年级的犯罪分子。 所以3& 1 NULL变量将成为theA so 2更新。 更新2

这是我在更新时的代码尝试

UPDATE Delinquents
SET d.IRSagentID = 'theAgt'
    FROM Delinquents d JOIN Individuals i 
    ON d.taxpayerID = i.taxpayerID
    WHERE d.IRSagentID IS NULL
    ORDER BY i.totalTaxOwed DESC
    LIMIT 2;

但是,我收到了这个错误:

psql:query1.sql:39: ERROR:  syntax error at or near "ORDER"
LINE 6:  ORDER BY i.totalTaxOwed DESC

我也试过这样做

UPDATE Delinquents
SET IRSagentID = 'theAgt'
WHERE IRSagentID IN (
    SELECT d.IRSagentID
    FROM Delinquents d JOIN Individuals i 
    ON d.taxpayerID = i.taxpayerID
    WHERE d.IRSagentID IS NULL
    ORDER BY i.totalTaxOwed DESC
    LIMIT 2);

但结果是Update 0。

我首先尝试选择查看结果,但我得到了我想在SELCET中看到的内容,但将其更改为更新很烦人。我不能做ORDER BY.So还有其他选择吗?下面是我用来获得我想要的结果的方法,但现在它只是添加更新。

SELECT d.taxpayerID, i.totalTaxOwed, d.IRSagentID
FROM Delinquents d JOIN Individuals i 
ON d.taxpayerID = i.taxpayerID
WHERE d.IRSagentID IS NULL
ORDER BY i.totalTaxOwed DESC
LIMIT 2;

2 个答案:

答案 0 :(得分:2)

您可以使用您拥有的SELECT作为UPDATE语句的来源:

UPDATE delinquents d
  set irsagentid = t.totaltaxedowed
FROM (
  SELECT d.taxpayerid, i.totaltaxedowed, d.irsagentid
  FROM delinquents d 
    JOIN individuals i ON d.taxpayerid = i.taxpayerid
  WHERE d.irsagentid IS NULL
  ORDER BY i.totaltaxedowed DESC
  LIMIT 2
) t 
where d.taxpayerid = t.taxpayerid;

在线示例:http://rextester.com/IJEE18608

这假设taxpayerid是表delinquents中的主键(并且在individuals中也是唯一的)。

答案 1 :(得分:0)

在更新0行的代码中:

UPDATE Delinquents
SET IRSagentID = 'theAgt'
WHERE IRSagentID IN (
    SELECT d.IRSagentID
    FROM Delinquents d JOIN Individuals i 
    ON d.taxpayerID = i.taxpayerID
    WHERE d.IRSagentID IS NULL
    ORDER BY i.totalTaxOwed DESC
    LIMIT 2);

我注意到3条关键线:

WHERE IRSagentID IN (
    SELECT d.IRSagentID
     WHERE d.IRSagentID IS NULL

即。你的嵌套子查询只返回NULL s,而NULL = NULL不是真的,这就是没有匹配的原因。

您应该在taxpayerID上匹配:

UPDATE Delinquents
SET IRSagentID = 'theAgt'
WHERE taxPayerID IN (
    SELECT d.taxpayerID
    FROM Delinquents d
    JOIN Individuals i ON d.taxpayerID = i.taxpayerID
    WHERE d.IRSagentID IS NULL
    ORDER BY i.totalTaxOwed DESC
    LIMIT 2);