簡體   English   中英

合並和源表多個匹配

[英]Merge and source table multiple matches

我遇到以下查詢問題:

merge into table2 d
using (
  select firstname, lastname, max(id) id
  from table1 t1
  group by firstname, lastname
  having count(0) = 1
) s
on (d.firstname=s.firstname and d.lastname=s.lastname)
when matched then update set t1_id = s.id;

如果table2中的多個行與ON子句匹配,那么我會收到“ SQL錯誤:ORA-30926:無法在源表中獲得穩定的行集”

您知道什么方法可以過濾,而忽略那些“重復項”嗎? 謝謝。

編輯

@Polppan,您對示例數據的要求以一種非常奇怪的方式引導了我:

這里有一些樣本數據:

table1
ID       firstname     lastname
1        John          Doe
2        John          DOE
3        Jane          Doe
4        Jane          Doe

(請注意上方)

table2
t1_ID    firstname     lastname
null     John          Doe
null     Jane          Doe
null     Jane          Doe

現在,在以下情況之前,我無法使用這些數據重現錯誤:

  • ON子句是“ UPPER(d.firstname)= UPPER(s.firstname)AND UPPER(d.lastname)= UPPER(s.lastname)”(這是我需要的,因為我需要不區分大小寫的匹配)
  • table1中的一行之一的DOE為大寫

知道為什么嗎?

嘗試使用DISTINCT

MERGE INTO   table2 d
      USING  (SELECT     DISTINCT ((firstname))fname, ((lastname))lname,max(id) id
                        FROM     table1 t1
                        GROUP BY   firstname, lastname
                     HAVING  COUNT (0) = 1
                  ) s
          ON     ( upper(d.firstname) = upper(fname)
                  AND upper(lastname) = upper(lname))
WHEN MATCHED
THEN
    UPDATE SET id = s.id;

更新1

MERGE INTO   table2 d
      USING  (SELECT     DISTINCT upper((firstname))fname, upper((lastname))lname,max(id) id
                        FROM     table1 t1
                        GROUP BY   firstname, lastname
                     HAVING  COUNT (0) = 1
                  ) s
          ON     ( upper(d.firstname) = upper(fname)
                  AND upper(lastname) = upper(lname))
WHEN MATCHED
THEN
    UPDATE SET id = s.id;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM