我正在尝试编写一个更新函数来更新前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;
答案 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);