2017-04-13 59 views
0

我試圖通過加入payid來更新payid表的eid的pay表。PayC表中有重複的eid s'匹配的payid s',每個只需要獲取一個EID匹配PAYID使用子查詢更新列

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) 

錯誤:子查詢返回的值超過1。 當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

,我們可以通過這個查詢找到重複的EID但需要獲取ONLY ONE EID

樣本數據

paycid payid eid amount year quarter 
1  101 1000 2000 2001 1 
2  101 1000 3000 2001 2 

需要爲匹配payid

eid 
1000 

+0

請提供樣本數據和期望的結果。 –

+1

今天提示:切換到現代,明確的'JOIN'語法。易於編寫(沒有錯誤),更易於閱讀和維護,並且在需要時更容易轉換爲外部聯接。 – jarlh

回答

0
select top 1 * from stuff 

可以。

0

像這樣的東西可能會有幫助嗎?

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或任何聚集你的要求來接你要用來更新你的工資表(我的例子使用MAX)的EID。這就是爲什麼你的原始查詢不起作用,你沒有告訴它使用哪個EID,而且它返回了多個值。

+0

我已經發布了示例輸出,您是否也可以檢查 –

+0

我的第二個版本應該可以工作,但是您需要刪除DISTINCT,因爲我認爲數據中會有多個EID,但看起來好像不是這樣來自你的樣本數據的情況。 –