2010-03-31 7 views
1

J'ai une table qui a deux champs (custno et custno2) qui doivent être recherchés à partir d'une requête. Je n'ai pas conçu cette table, alors ne me crie pas dessus. :-) J'ai besoin de trouver tous les enregistrements où custno ou custno2 correspond à la valeur retournée par une requête sur la même table basée sur un titleno. En d'autres termes, l'utilisateur saisit 1234 pour le titleno. Ma requête recherche dans la table le custno associé au titleno. Il cherche aussi le custno2 pour ce titleno. Ensuite, il doit faire une recherche sur la même table pour tous les autres enregistrements qui ont le custno ou custno2 retourné dans la recherche précédente dans les champs custno ou custno2 pour ces autres enregistrements.Besoin d'aide pour régler une instruction SQL

Voici ce que je suis venu avec:

SELECT BILLYR, BILLNO, TITLENO, VINID, TAXPAID, DUEDATE, DATEPIF, PROPDESC 
FROM TRCDBA.BILLSPAID 
WHERE CUSTNO IN 
(select custno from trcdba.billspaid where titleno = '1234' 
    union select custno2 from trcdba.billspaid where titleno = '1234' and custno2 != '') 
OR CUSTNO2 IN 
(select custno from trcdba.billspaid where titleno = '1234' 
    union select custno2 from trcdba.billspaid where titleno = '1234' and custno2 != '') 

La requête prend environ 5-10 secondes pour renvoyer des données. Peut-il être réécrit pour travailler plus vite?

+0

Pour quelle base de données (version aussi bien)? –

+0

La table peut-elle contenir un custno et un custno2 simultanément? –

Répondre

1

Un simple coup de pouce rapide pourrait être de changer votre « union » à « union tous » (Je suis un gars de serveur sql - ce que cela s'applique à d'autres dbs)

Dans le cas contraire, il peut exiger certaines spécifiques à db astuces - quel DB utilisez-vous?

+0

+1 Je suis d'accord, 'UNION ALL' devrait donner un certain avantage. –

0

De même, dans votre solution proposée, vous filtrez quatre fois la table BILLSPAID contre titleno = 1234. Selon votre plate-forme DB, le nombre d'éléments avec titleno en double, et si titleno est indexé, vous pouvez gagner de manière significative en utilisant une table temporaire. Encore une fois, en fonction de votre plate-forme, cela pourrait ressembler à quelque chose comme:

SELECT * FROM TRCDBA.BILLSPAID INTO MyTempTable 
WHERE titleno = '1234'; 

SELECT BILLYR, BILLNO, TITLENO, VINID, TAXPAID, DUEDATE, DATEPIF, PROPDESC 
FROM MyTempTable 
WHERE CUSTNO IN 
(select custno from MyTempTable 
    union all select custno2 from MyTempTable where custno2 != '') 
OR CUSTNO2 IN 
(select custno from MyTempTable 
    union all select custno2 from MyTempTable where custno2 != '') 
+0

Si vous souhaitez utiliser une table temporaire, vous pouvez également utiliser des valeurs distinctes de custno et custno2 pour réduire les sous-requêtes à des sélections de table unique. –

0

Ceci demande une normalisation appropriée. Si vous avez plusieurs clients pour la même facture, ils doivent figurer dans une table associée. Lorsque vous avez des champs comme custno, custno2, vous avez généralement un problème de conception qui doit être résolu.

+0

Vous prêchez à la chorale. Je n'ai pas conçu ça. Je dois juste accéder aux données pour mes applications Web. – user338413

Questions connexes