多SELECT SQL语句

时间:2012-08-08 16:08:30

标签: sql-server nested-queries

编写我的第一个嵌套SELECT语句,我希望有人可以帮助我。

我需要从CompanyCode表中抓取AgentIdUniqueAgentIdtoUniqueAgentId。但是,我只需要在另一个表的查询中显示的那些。行之间的公共链接将是UniqueAgentId列(基本上我需要从包含相同CompanyCode的行中抓取AgentIdUniqueAgentId。嵌套查询)。

当我写出这个问题时,我收到了非常有用的消息

  

')'

附近的语法不正确

查询:

SELECT 
    CompanyCode, AgentId
FROM 
    UniqueAgentIdToUniqueAgentId un
WHERE 
    un.UniqueAgentId = 
       (SELECT UniqueAgentId 
        FROM 
            (SELECT q.LastChangeDate, a.UniqueAgentId 
             FROM QueueUpdates q, AgentProductTraining a 
             WHERE a.LastChangeDate >= q.LastChangeDate)
       )

EDIT 非常感谢您的回复。使用下面的每个单独的查询,但我不断收到相同的错误消息:无效的对象名称'UniqueAgentIdToUniqueAgentId'。这对我来说很奇怪,因为这是SQL Management Studio可以看到的数据库上的实际表。

第二次编辑 结果只是一个拼写错误。新错误是“varchar值'3030111101'的转换溢出了一个int列。”不太清楚这意味着什么......

最终编辑 我试图将char与它进行比较,这导致了这个错误。再次感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

如果在许多数据库中有子查询,则需要为其指定别名:

SELECT CompanyCode, AgentId
FROM UniqueAgentIdToUniqueAgentId un
WHERE un.UniqueAgentId = 
      (SELECT UniqueAgentId 
       FROM (SELECT q.LastChangeDate, a.UniqueAgentId 
             FROM QueueUpdates q, AgentProductTraining a 
             WHERE a.LastChangeDate >= q.LastChangeDate
            ) t
      )

但是,您的内部查询可能会返回多个值,并且您不需要两个嵌套查询:

SELECT CompanyCode, AgentId
FROM UniqueAgentIdToUniqueAgentId un
WHERE un.UniqueAgentId in
      (SELECT UniqueAgentId 
       FROM QueueUpdates q, AgentProductTraining a 
       WHERE a.LastChangeDate >= q.LastChangeDate
      )

并且,在这种情况下使用JOIN语法更合适:

SELECT CompanyCode, AgentId
FROM UniqueAgentIdToUniqueAgentId un
WHERE un.UniqueAgentId in
      (SELECT UniqueAgentId 
       FROM QueueUpdates q join
            AgentProductTraining a 
            on a.LastChangeDate >= q.LastChangeDate
      )

这应该有所帮助。

答案 1 :(得分:0)

SELECT CompanyCode, AgentId
    FROM UniqueAgentIdToUniqueAgentId un
    WHERE un.UniqueAgentId = 
    (
        SELECT UniqueAgentId 
         FROM AgentProductTraining  where UniqueAgentId IN
           (
            SELECT q.LastChangeDate, a.UniqueAgentId 
            FROM QueueUpdates q, AgentProductTraining a 
            WHERE a.LastChangeDate >= q.LastChangeDate
            )
    )

答案 2 :(得分:0)

您需要声明一个别名,这是您实际报告的问题,并且可能使用IN子句而不是=运算符进行多次返回:

SELECT CompanyCode
    ,AgentId
FROM UniqueAgentIdToUniqueAgentId un
WHERE un.UniqueAgentId in (
        SELECT UniqueAgentId
        FROM (
            SELECT q.LastChangeDate
                ,a.UniqueAgentId
            FROM QueueUpdates q
                ,AgentProductTraining a
            WHERE a.LastChangeDate >= q.LastChangeDate
            ) a 
        )

答案 3 :(得分:0)

您的子查询可能返回超过1个值。你必须使用IN。
您也可以避免使用两个子查询,只使用一个。

SELECT CompanyCode, AgentId
FROM UniqueAgentIdToUniqueAgentId un
WHERE un.UniqueAgentId IN 
(
    SELECT a.UniqueAgentId 
    FROM QueueUpdates q, AgentProductTraining a 
    WHERE a.LastChangeDate >= q.LastChangeDate
)

注意以这种方式获得表格别名 q a 笛卡儿积。 我不知道这是不是你想要的;也许连接应该更好。