2013-09-23 2 views
0

Я сталкиваются с проблемой с помощью следующего запроса:Слить и исходная таблица множественным соответствует

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 матче положение о, тогда я получаю «Ошибка SQL: ORA-30926: не удалось получить стабильный набор строк в исходных таблицах "

Вы знаете какой-либо способ фильтрации и просто игнорировать эти« дубликаты »? Спасибо.

EDIT

@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 

сейчас, я не мог воспроизвести UCE ошибку с этими данными до:

  • пункт о является "ВЕРХНИЙ (d.firstname) = ВЕРХНИЙ (s.firstname) и верхней части (d.lastname) = ВЕРХНИЙ (s.lastname)" (который является что у меня есть, так как мне нужно регистронезависимое соответствие)
  • одну из линий в table1 имеет DOE в верхнем регистре

Любая идея, почему?

ответ

1

Попробуйте использовать 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; 

Update 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; 
+2

Я надеюсь, что вы не используете 'счетчик (0)', потому что вы думаете, что это быстрее, чем 'COUNT (*)' –

+0

I уже используют DISTINCT, но с тем же результатом. На самом деле, я думаю, что проблема находится в предложении ON (редактирование начального сообщения). (и я использую count (0), потому что фрагмент, который я скопировал, использовал это ;-)) – bertrand

+0

@bertrand Можете ли вы предоставить образцы данных? – user75ponic

Смежные вопросы