[英]Update column using Subquery
我正在尝试通过加入payid用payc表的eid更新pay表的eid。在PayC表中,匹配的payid s有重复的eid s',需要为每个匹配的PAYID仅获得一个EID
update PAY
SET eid = (select t.EID from (select a.EID,a.PAYID, count(a.EID) as cnt
from PAYC a,PAYC b
where a.payid = b.payid
group by a.PAYID,a.eid
having count( a.eid) > 1) t
where T.payid = PAYID)
WHERE EXISTS (select 'X' from (select a.EID,a.PAYID, count(a.EID) as cnt
from PAYC a,PAYC b
where a.payid = b.payid
group by a.PAYID,a.eid
having count( a.eid) > 1) t
where T.payid = PAYID)
错误:子查询返回了多个值。 当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。
我们可以通过此查询找到重复的EID,但只需要获取一个EID
select a.EID,COUNT(a.PAYID), count(a.EID) as cnt
from PAYC a,PAYC b
where a.payid = b.payid
group by a.PAYID,a.eid
having count( a.eid) > 1 AND
COUNT(a.PAYID) >1
样本数据
paycid payid eid amount year quarter
1 101 1000 2000 2001 1
2 101 1000 3000 2001 2
需要获取
eid
1000
匹配的Payid
select top 1 * from stuff
可能会。
这样的事情可能会有所帮助?
WITH Duplicates AS (
SELECT
a.EID,
a.PAYID,
ROW_NUMBER() OVER (PARTITION BY a.PAYID ORDER BY a.EID) AS ROWID
FROM
PAYC a
INNER JOIN PAYC b ON b.PAYID = a.PAYID
GROUP BY
a.EID,
a.PAYID
HAVING
COUNT(a.EID) > 1)
UPDATE
p
SET
EID = d.EID
FROM
PAY p
INNER JOIN Duplicates d ON d.PAYID = p.PAYID AND d.ROWID = 1;
尽管我不得不承认,我不理解您从PAYC到PAYC的自我加入的逻辑。 您肯定不需要这样做来查找每个PAYID有多个EID的情况吗? 在那种情况下,您可以完全删除INNER JOIN PAYC b行?
再多考虑一下之后,您能不能简单地做到这一点?
WITH Duplicates AS (
SELECT
PAYID,
MAX(EID) AS EID
FROM
PAYC
GROUP BY
PAYID
HAVING
COUNT(DISTINCT EID) > 1)
UPDATE
p
SET
EID = d.EID
FROM
PAY p
INNER JOIN Duplicates d ON d.PAYID = p.PAYID;
然后使用MAX,MIN或您需要的任何聚合来选择要用于更新PAY表的EID(我的示例使用MAX)。 这就是为什么您的原始查询不起作用,您没有告诉它要使用哪个EID以及它返回多个值的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.