2010-08-18 6 views
0

J'ai une requête avec jointure interne à une autre table, avec ceci je veux également inclure les enregistrements qui sont contenus dans une autre colonne.Sélection d'enregistrements basés sur deux autres tables

Exemple:

select name, address from table1 
inner join table2 on table1.id = table2.id 

Avec cela, je veux inclure également des lignes qui ont des table1.recno = (1,2,4).

Comment puis-je écrire une requête pour cela?

Une option que je connais est d'utiliser le mot-clé IN au lieu de la première jointure de table. Mais notre client ne veut pas utiliser le mot clé IN.

+0

@Jenn, si vous ne l'aimez pas IN - vous pouvez utiliser EXISTE, (exigence très étrange - ne pas utiliser IN) –

+0

Il peut y avoir une raison pour ne pas utiliser IN, si je me souviens bien. Je pense que "IN" va scanner la table entière, tandis que l'utilisation de EXISTS s'arrêtera dès qu'un enregistrement correspondant est trouvé. Je ne me souviens pas où j'ai lu cela et si la source était fiable, donc je peux me tromper complètement –

+1

'IN' est du sucre syntactique pour (a = 1 OU a = 2 OU a = 4). Demander de ne pas l'utiliser, c'est comme essayer d'utiliser un PC sans souris ... – cjk

Répondre

1

Utilisez une jointure à gauche, puis utilisez la clause WHERE pour filtrer les lignes dont vous avez besoin.

select name, address 
from table1 
    left join table2 on table1.id = table2.id 
where 
    table2.id IS NOT NULL OR table1.ID In (1,2,4) 

Ou si vous voulez éviter un IN anodin pour des raisons stupides, utilisez:

select name, address 
from table1 
    left join table2 on table1.id = table2.id 
where 
    table2.id IS NOT NULL 
    OR table1.ID = 1 
    OR table1.ID = 2 
    OR table1.ID = 4 
+0

[quote] Une option que je connais est d'utiliser le mot clé IN au lieu de la première jointure de table. Mais notre client ne veut pas utiliser le mot clé IN. [/ Quote] – jigfox

+0

@jigfox, êtes-vous Jenn? –

+0

Non, pourquoi penseriez-vous cela? – jigfox

Questions connexes