Insert-Select: чтение данных из другой таблицы, когда 2 атрибута не совпадают (производительность) - PullRequest
1 голос
/ 22 июля 2010

У меня есть такая таблица:

Create Table PersonAgent (
    PersonID    varchar2(10) not null,
    AgentID     varchar2(10) not null,
    Address     varchar2(50),
    City        varchar2(50),
    Country     varchar2(50)
)

Что ж, мне нужно сгенерировать эту таблицу новой, потому что некоторые данные неверны.

Если PersonID и AgentID совпадают, тоЯ могу взять другие атрибуты такими, какие они есть, но если они не совпадают, мне нужно прочитать из другой таблицы.

Маленький пример:

INSERT INTO PersonAgent_copy(PersonID, AgentID, Address, City, Country)
Select Pa.Persid, Pa.Agentid, 
    (Case
      When Pa.Personid = Pa.Agentid
      Then pa.Address
      ELSE (SELECT p.Address
          FROM Person p
          Where Pa.Agentid = P.Personid)),
    (Case
      When Pa.Personid = Pa.Agentid
      Then pa.City
      ELSE (SELECT p.City
          FROM Person p
          Where Pa.Agentid = P.Personid)),
    (Case
      When Pa.Personid = Pa.Agentid
      Then pa.Country
      ELSE (SELECT p.Country
          From Person P
          Where Pa.Agentid = P.Personid))
FROM PersonAgent pa

(Есть еще несколько атрибутов, которыеработает так же)

Какой самый быстрый способ сделать это?

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

Вы можете попробовать это

INSERT INTO PersonAgent_copy(PersonID, AgentID, Address, City, Country)
Select Pa.Persid, Pa.Agentid, pa.Address, pa.City, pa.Country
FROM PersonAgent pa
where Pa.Personid = Pa.Agentid 
union all 
Select Pa.Persid, Pa.Agentid, p.Address, p.City, p.Country
FROM PersonAgent pa, Person p 
where Pa.Personid <> Pa.Agentid and Pa.Agentid = P.Personid

Я не проверял это, но вы можете попробовать.

1 голос
/ 22 июля 2010

Вам было бы намного лучше, если бы вы делали это следующим образом:

INSERT INTO PersonAgent_copy(PersonID, AgentID, Address, City, Country)
select pa.persid, pa.agentid,
    Case
      When Pa.Personid = Pa.Agentid
      Then pa.Address
      ELSE p.Address
      END,
    Case
      When Pa.Personid = Pa.Agentid
      Then pa.City
      ELSE p.City
      END,
    Case
      When Pa.Personid = Pa.Agentid
      Then pa.Country
      ELSE p.Country
      END
from
   PersonAgent pa 
   left outer join
   Person p
   on pa.agent_id = p.person_id

Причина этого в том, что при вашем методе каждый раз, когда personid и agentid выполняются одинаковыми тремя запросами, необходимо выполнитьпротив человека таблицы.Это может сложить очень быстро.При моем методе таблица Person запрашивается один раз.

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