Обновить таблицу дубликатов столбцов с объединением - PullRequest
0 голосов
/ 19 апреля 2011

У меня проблема с обновлением Oracle SQL с помощью join.У меня есть таблица А, которая имеет 5 столбцов (C1, C2, C3, C4, C5);таблица B, которая имеет 3 столбца (D1, D2, D3).Для таблицы A я использую только 2 столбца (C2, C3), чтобы присоединиться к таблице B (D1, D2), и обновляю столбец C2 таблицы A с столбцом таблицы D B3.

Для таблицы A будет много дубликатов для обоихС2 и С3;но для условия C4 как 10 не будет дубликатов, которые я хочу обновить.

Например, таблица A имеет записи как:

1,100,1500,10,'ORG'
1,200,2000,10,'ORG'
1,300,2500,10,'ORG'
2,1000,500,20,'PERSON'
2,1000,200,20,'PERSON'
2,2000,200,20,'PERSON'

Вы можете видеть это для C4для 10 нет дубликатов для C2 и C3.Но для C4 как 20 будут дубликаты для C2 и C3.

Для таблицы B это будет выглядеть как

100,1500,80
200,2000,100
300,3000,200

Для таблицы B нет дубликатов, и она присоединится к Bс A как A.C2 = B.D1 и A.C3 = B.D2 для обновления A.C2 до B.D3.

Мне нужно только обновить записи C4 = 10, чтобы объединиться с таблицей B на основеB.D1 и B.D2.

У меня SQL, как показано ниже, но не удалось, так как

ORA-01779: невозможно изменить столбец, который сопоставляется с таблицей без сохранения ключа

Может кто-нибудь сказать мне, что не так с моим SQL?

UPDATE ( 
  SELECT A.C2 OID, B.D3 TID FROM A, B 
  WHERE A.C2 = B.D1 AND A.C3 = B.D2 AND A.C4=10 AND B.D3 <> ' ' ) 
SET OID = TID

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

Не можете ли вы использовать оператор обновления, например ...

UPDATE A
  set c2 = (select D3
              from B
              where B.D2 <> ' ' and 
                    A.C2 = b.D1 and A.C3=B.D2)
           )
  where A.C4=10

Кроме того, ваш вопрос и само описание проблемы выглядят как головоломка, которую очень трудно понять.

Можете ли вы опубликовать некоторые данные и создать операторы таблиц, чтобы было легко воспроизвести ваш случай? (Возможно, в следующий раз ...)

0 голосов
/ 19 апреля 2011

Во-первых, похоже, что вы пытаетесь обновить TableA.Во-вторых, официальная спецификация ANSI для оператора Update не предусматривает соединения непосредственно в операторе (вы можете иметь объединения только через подзапросы).Одна из причин заключается в том, что это приведет к неоднозначности, когда будут задействованы повторяющиеся строки.Итак, вы можете попробовать что-то вроде:

Update A
Set OID =   (
                Select B.D3
                From B
                Where B.D1 = A.C2
                    And B.D2 = A.C3
                    And B.D3 Is Not Null
                )           
Where A.C4 = 10
    And Exists  (
                Select 1
                From B
                Where B.D1 = A.C2
                    And B.D2 = A.C3
                    And B.D3 Is Not Null
                )
0 голосов
/ 19 апреля 2011
UPDATE A
SET C2 = (
    SELECT B.D3
    FROM B
    WHERE A.C2 = B.D1 AND A.C3 = B.D2)
WHERE A.C4=10
  AND EXISTS (
    SELECT *
    FROM B2
    WHERE A.C2 = B2.D1 AND A.C3 = B2.D2)

Нет необходимости использовать псевдоним для операторов обновления. Также у вас есть условие для B.D2 <> ' ', а также A.C3 = B.D2, так что просто отфильтровать по A.C3 <> ' ' так же легко, так как A является целевой таблицей. Если A.C3 никогда не пусто, то условие даже не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...