2010-07-22 2 views
1

J'ai une table comme ceci:-Select: la lecture des données d'autres tables lorsque 2 Attributs r pas la même (performance)

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

Eh bien, je besoin de générer ce nouveau tableau, Coze certaines données sont incorrects.

Si PersonID et AgentID sont identiques alors je peux prendre les autres attributs comme ils sont mais s'ils ne sont pas les mêmes, alors j'ai besoin de lire d'une autre table.

Petit exemple:

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 

(Il y a quelques autres attributs qui fonctionne de la même)

Quel est le meilleur moyen de le faire?

Répondre

2

Vous pouvez essayer cette

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 

Je ne suis pas testé, mais vous pouvez l'essayer.

+0

Ahh damit pourquoi n'ai-je pas eu cette idée ...: d Thx mate! – domiSchenk

+0

Lorsque vous voulez copier beaucoup de données, n'utilisez pas une instruction INSERT. Mieux vaut "CREATE TABLE PersonAgent_copy AS SELECT ...". C'est beaucoup plus rapide! – Tim

+0

Regarde intresting Tim, copie-t-il FK et PKs? – domiSchenk

1

Vous seriez beaucoup mieux le faire de cette façon:

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 

La raison en est que, avec votre méthode, tous les personid et agentid temps sont les mêmes trois requêtes doivent être exécutés contre la table Person. Cela peut s'additionner très rapidement. Avec ma méthode, la table Person est interrogée une fois.

+0

Je pense que la performance entre votre échantillon et Trurl sont presque les mêmes – domiSchenk

+0

Je voulais dire que c'est mieux que votre solution originale, pas l'autre réponse. – Allan

Questions connexes