4

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

我需要从桌子上抓起CompanyCodeand 。但是,我只需要在另一个表的查询中显示的那些。行之间的公共链接将是列(基本上我需要从包含与嵌套查询中出现的相同的行中获取和)。AgentIdUniqueAgentIdtoUniqueAgentIdUniqueAgentIdCompanyCodeAgentIdUniqueAgentId

当我写出这个查询时,我得到了非常有用的信息

')' 附近的语法不正确

询问:

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

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

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

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

4

4 回答 4

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
      )

那应该有帮助。

于 2012-08-08T16:15:10.997 回答
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
)

请注意,通过这种方式,您可以获得表别名qa的笛卡尔积。我不知道这是否是您想要的;也许加入应该更好。

于 2012-08-08T16:15:04.817 回答
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
            )
    )
于 2012-08-08T16:11:44.603 回答
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 
        )
于 2012-08-08T16:12:05.210 回答