SQL,嵌套查询,子查询,相关查询

时间:2010-11-08 22:21:58

标签: sql sql-server

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

所以,我有一个表,让我们称之为链接到未注册和已注册表的事件。我想在此注册表中的内容中找到任何事件中的所有未注册和已注册的行。

Unregistered和Registered -tables都有几个(或没有)具有相同事件ID的条目。这只是演示内容和名称,但问题是真实的。

你看到了问题,这里我需要两次查询ID范围,如何在一个查询中进行此操作并在两个union语句中使用结果?至于什么是执行输出查询的最佳和最有效的方法?

这是MS SQL Server。

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以稍微重新组织查询以避免两个相同的子查询。

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%' )