2010-11-08 91 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 

所以,我有一个表,让我们把它链接到表和未注册登记的事件。我想在此注册表中的内容中找到的任何事件中选择所有未注册和已注册的行。SQL,嵌套查询,子查询,关联查询

两个未注册和注册-tables有几个(或无)条目具有相同的事件ID。这只是演示内容和名称,但问题是真实的。

你看这个问题,在这里我需要为ID范围查询两次,我怎样才能使这个在一个查询和两者结合语句中使用的结果呢?如何以最佳和最有效的方式执行输出查询?

这是MS SQL Server。

谢谢!

+0

这是SQL Server吗? Postgres的? MySQL的?甲骨文? – 2010-11-08 22:24:30

+1

为什么他们存储在两个表,当它应该是一个与类型代码登记/未登记区分? – 2010-11-08 22:26:35

+0

其MS SQL。不要担心的内容,这是(在)问题的简单的例子,我尝试找出最新的最佳途径,为输出信号进行这样的查询。尽管如此,这是表格的结构和问题的类型。 – Hellodear 2010-11-08 22:44:55

回答

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