2010-12-03 16 views
2

Tout d'abord de mettre les choses en contexte, je suis en train d'écrire une recherche sur SQL Server 2005. Voici ma structure de tableinscription sur les tables OU (répétition des données) - SQL Server 2005

Schema1.Table1 
GUID 
1 
2 
3 

Schema2.Table2 
GUID MAINTITLE 
1 Water Monkies 
2 Water Doggies 

Schema3.Table3 
GUID MAINTITLE 
3 Water Hyrdas 

comportement attendu est que l'utilisateur va chercher 'Eau' et je dois récupérer tous les GUID dans Schema1.Table1 les faire correspondre avec les entrées dans Schema2.Table2 et Schema3.Table3 où GUID dans la liste ET MAINTITLE comme '% WATER%'

I devons y parvenir en utilisant JOINS.

Ce que je l'ai fait jusqu'à présent est:

select Schema1.Table1.GUID 
from Schema1.Table1 JOIN Schema2.Table2 ON Schema1.Table1.GUID = Schema2.Table2.GUID 
JOIN Schema3.Table3 ON Schema1.Table1.GUID = Schema3.Table3.GUID 

mais renvoie un résultat qui me donne associés par aucun résultat

J'ai ensuite essayé

select distinct Schema1.Table1.GUID 
from Schema1.Table1, Schema2.Table2, Schema3.Table3 
where (Schema2.Table2.GUID=Schema1.Table1.GUID OR Schema3.Table3.GUID=Schema1.Table1.GUID 
) AND (Schema2.Table2.MAINTITLE like '%water%' OR Schema3.Table3.MAINTITLE like '%water%') 

mais depuis cette est une jointure implicite qui retourne toutes les lignes de table2 où le maintitle de table3s est aussi de l'eau.

Puis-je aider certains plese?

+2

Votre CTO « déteste les requêtes syndicales »? Temps pour un nouvel emploi. –

Répondre

1

il n'est pas possible de faire cela avec des jointures, vous devez utiliser des unions. bien que je ne peux pas fournir une preuve de cette

select T1.GUID 
from T1 join (T2 union all T3) as T on T1.GUID=T.GUID 
where T.MAINTITLE like '%WATER%' 

peut-être

+0

Je finirai par essayer de le vendre dans les prochains instants je pense. Merci pour l'aide! –

1

Vous pouvez essayer d'utiliser un LEFT JOIN et ISNULL

select Schema1.Table1.GUID, 
     ISNULL(Schema2.MAINTITLE, Schema3.MAINTITLE) 
from Schema1.Table1 LEFT JOIN 
     Schema2.Table2 ON Schema1.Table1.GUID = Schema2.Table2.GUID LEFT JOIN 
     Schema3.Table3 ON Schema1.Table1.GUID = Schema3.Table3.GUID 
WHERE ISNULL(Schema2.MAINTITLE, Schema3.MAINTITLE) LIKE '%blabla%' 

Un UNION ALL ne semble comme une meilleure option, mais cela peut aussi travailler .

ont également un oeil à l'aide COALESCE (Transact-SQL) au lieu de ISNULL

+0

Cela fonctionne mais l'ennuyeux est que cela peut s'étendre à 4 ou 5 ou 6 tables aussi. Dans ce cas, je finirais par faire un ISNULL (ISNULL (ISNULL imbriqué appel à l'infini (sauf si je me trompe) Merci pour l'aide, vraiment l'apprécier! –