繁体   English   中英

使用子查询更新列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM