2010-11-08 10 views
1
SELECT T.[NAME] FROM ( 
    SELECT Unregistered.[NAME] 
    FROM Unregistered 
     LEFT JOIN [Event] ON Event.ID = Unregistered.EventID 
    WHERE EventID IN ( 
         SELECT EventID 
         FROM Registered WHERE [NAME] Like '%blabla%') 
    UNION ALL 
    SELECT Registered.[NAME] 
    FROM Registered 
     LEFT JOIN [Event] ON Event.ID = Registered.EventID 
    WHERE EventID IN ( 
         SELECT EventID 
         FROM Registered WHERE [NAME] Like '%blabla%') 
) AS T 

Donc, j'ai une table, appelons-la Evénements liés aux tables non enregistrées et enregistrées. Je veux sélectionner toutes les lignes non enregistrées et enregistrées dans tout événement trouvé par le contenu de ce tableau enregistré.SQL, requêtes imbriquées, sous-requêtes, requêtes corrélées

Les tables non enregistrées et enregistrées ont plusieurs entrées (ou aucune) avec le même ID d'événement. Ceci est juste le contenu de la démo et les noms, mais le problème est réel.

Vous voyez le problème, ici j'ai besoin de demander deux fois pour la plage d'ID, comment puis-je faire cela dans une requête et utiliser le résultat dans les deux déclarations d'union? Comme dans quoi est le moyen le meilleur et le plus efficace d'effectuer une requête pour la sortie?

C'est MS SQL Server.

Merci!

+0

Est-ce SQL Server? Postgres? MySQL? Oracle? –

+1

Pourquoi sont-ils stockés dans deux tables, quand il devrait être un avec un code de type pour différencier enregistré/non enregistré ?! –

+0

Son MS SQL. Ne vous inquiétez pas du contenu, c'est un exemple (plus) simplifié du problème, j'essaie de trouver quelle est la meilleure façon d'effectuer une telle requête pour la sortie. Néanmoins, c'est la structure des tables et le type de problème. – Hellodear

Répondre

2

Vous pouvez réorganiser un peu la requête pour éviter les deux sous-requêtes identiques.

SELECT t.[NAME] 
FROM 
    (
    SELECT [EventID], [Unregistered].[NAME] 
    FROM [Unregistered] 
    UNION ALL 
    SELECT [EventID], [Registered].[NAME] 
    FROM [Registered] 
    ) t 
LEFT OUTER JOIN [Event] ON t.[EventID] = [Event].[ID] 
WHERE t.[EventID] IN (SELECT [EventID] FROM [Registered] WHERE [NAME] Like '%blabla%')