簡體   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