Tsql 当子查询未引入EXISTS时,只能在选择列表中指定一个表达式。

Tsql 当子查询未引入EXISTS时,只能在选择列表中指定一个表达式。,tsql,Tsql,我有以下疑问: SELECT QuoteReference,        CreatedDate,        StartDate,        EndDate,        Operation,        TableName,        OccurredAt,        PerformedBy,        FieldName,        OldValue,        NewValue,        Quotes.CreatedByID,        Comp

我有以下疑问:

SELECT QuoteReference,
       CreatedDate,
       StartDate,
       EndDate,
       Operation,
       TableName,
       OccurredAt,
       PerformedBy,
       FieldName,
       OldValue,
       NewValue,
       Quotes.CreatedByID,
       CompletedDate,
       EmailAddress = (SELECT ContactDetails.EmailAddress,
                              QuoteReference,
                              ContactDetails.MobilePhoneNumber
                       FROM   ContactDetails,
                              Quotes,
                              QuoteCustomers
                       WHERE  ContactDetails.ID = Quotes.ID
                              AND QuoteCustomers.QuoteID = ContactDetails.ID)
FROM   Quotes
       JOIN Audit
         ON Quotes.ID = Audit.RowId
WHERE  Quotes.CreatedDate BETWEEN '20100401' AND '20120830'
       AND PaymentReference IS NOT NULL
       AND Audit.OccurredAt > Quotes.CompletedDate
       AND Quotes.EmailAddress < > NULL
       AND TableName = 'Quotes'
       AND Quotes.PolicyReference = NULL
       AND Quotes.CreatedByID < > 2 
ORDER BY  Audit.OccurredAt desc
选择QuoteReference,
创建日期,
开始日期,
结束日期,
操作,
表名,
发生,
执行者,
字段名,
OldValue,
新价值,
Quotes.CreatedByID,
完成日期,
EmailAddress=(选择ContactDetails.EmailAddress,
引用引用,
ContactDetails.MobilePhoneNumber
从联系人详细信息来看,
引述,
报价人
其中ContactDetails.ID=Quotes.ID
和QuoteCustomers.QuoteID=ContactDetails.ID)
引述
加入审计
ON Quotes.ID=Audit.RowId
其中Quotes.CreatedDate介于“20100401”和“20120830”之间
并且PaymentReference不为空
和Audit.OccurredAt>Quotes.CompletedDate
和Quotes.EmailAddress<>空
和TableName='Quotes'
AND Quotes.PolicyReference=NULL
和Quotes.CreatedByID<>2
按审核顺序。发生日期描述
我在执行时遇到此错误:

当子查询未引入EXISTS时,只能在选择列表中指定一个表达式


在子查询中添加第二个where子句之后。如何解决此问题?

您在一个变量中选择了三列值

改变

EmailAddress = (SELECT EmailAddress,
                          QuoteReference,
                          ContactDetails.MobilePhoneNumber
                   FROM   ContactDetails,
                          Quotes,
                          QuoteCustomers
                   WHERE  ContactDetails.ID = Quotes.ID
                          AND QuoteCustomers.QuoteID = ContactDetails.ID)


您的子查询必须返回一行和一列,因此它应该如下所示:

   EmailAddress = (SELECT TOP 1 ContactDetails.EmailAddress
                   FROM   ContactDetails,
                          Quotes,
                          QuoteCustomers
                   WHERE  ContactDetails.ID = Quotes.ID
                          AND QuoteCustomers.QuoteID = ContactDetails.ID)

为什么要在子查询中选择
QuoteReference,ContactDetails.MobilePhoneNumber
?您只需要
EmailAddress
,因为您要将其分配给单个列。
   EmailAddress = (SELECT TOP 1 ContactDetails.EmailAddress
                   FROM   ContactDetails,
                          Quotes,
                          QuoteCustomers
                   WHERE  ContactDetails.ID = Quotes.ID
                          AND QuoteCustomers.QuoteID = ContactDetails.ID)