SQL select语句,它检查两列并从第三列返回值

时间:2015-08-21 13:54:55

标签: sql sql-server sql-server-2012

我正在编写一个访问同一数据库中多个表的查询。对于select语句中的一列,我需要返回

Table1.Column4 where Table1.Column = Table3.Column1 AND Table1.Column2 = Table4.Column1

我把它写成:

SELECT AccNum.FieldValue 
FROM  PersonFieldValuesVW 
INNER JOIN PersonFieldValuesVW AccNum 
ON AccNum.PersonId = InPerson.PersonId
     INNER JOIN InPerson 
     ON InPerson.IncidentId = Incident.Id 
WHERE AccNum.FieldDescr like '%Account Number%') as [Account Number],

这将返回错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

以下是完整查询,我们将不胜感激。

SELECT DISTINCT
    CaseNum as [Case Number],
    ALCategoryVW.Category as [Category],
    ALCategoryVW.SubCategory as [Sub Category],
    InAssign.AssignToName as [Assigned To],
    ReportedDate as [Open Date],
    EndDate as [Closed Date], --This a placeholder for a closed date
    [Status],
    SiteLoc1.Descr as [Loss Location],
    LocDetails as [Loss Cost Center],
    SiteLoc1.Region as [Region],
    SiteLoc1.SubRegion as [Sub Region],
    -- SiteLoc2.Descr as [Location Description], **Need this though returning all for the location?
    CASE WHEN SAR.FieldId = '604NU' and SAR.FieldValue <> 'False' THEN 'YES' ELSE 'NO' END as [SAR Required],
    Summary as [Incident Summary],
    Disposition as [Case Disposition],
    (
        SELECT AccNum.FieldValue
        FROM  PersonFieldValuesVW
        INNER JOIN PersonFieldValuesVW AccNum ON AccNum.PersonId = InPerson.PersonId
        INNER JOIN InPerson ON InPerson.IncidentId = Incident.Id
        WHERE AccNum.FieldDescr like '%Account Number%'
    ) as [Account Number],
    FORMAT(AuditItemDetail.ItemValue, '#,###') as [Potential Loss],
    FORMAT(AuditItemDetail.ItemValue - AuditItemDetail.PreventedExposureAmount, '#,###') as [Actual Loss]
FROM Incident
INNER JOIN ALCategoryVW ON ALCategoryVW.IncidentId = Incident.Id
INNER JOIN InAssign ON InAssign.IncidentId = Incident.Id
INNER JOIN SiteLoc1 ON SiteLoc1.Id = Incident.LocId
INNER JOIN SiteLoc2 ON SiteLoc2.SiteLoc1Id = SiteLoc1.Id
INNER JOIN IncidentFieldValuesVW SAR ON SAR.IncidentId = Incident.Id
INNER JOIN InItem ON InItem.IncidentId = Incident.Id
INNER JOIN AuditItemDetail ON AuditItemDetail.ItemId = InItem.ItemId
INNER JOIN InPerson ON InPerson.IncidentId = Incident.Id
INNER JOIN PersonFieldValuesVW AccNum ON AccNum.PersonId = InPerson.PersonId

1 个答案:

答案 0 :(得分:1)

这应该可以解决您的错误,但我不确定它在逻辑上是否正确。如果您在子选择中返回了两个记录,那么哪一个是“正确的”。

SELECT DISTINCT
    CaseNum as [Case Number],
    ALCategoryVW.Category as [Category],
    ALCategoryVW.SubCategory as [Sub Category],
    InAssign.AssignToName as [Assigned To],
    ReportedDate as [Open Date],
    EndDate as [Closed Date], --This a placeholder for a closed date
    [Status],
    SiteLoc1.Descr as [Loss Location],
    LocDetails as [Loss Cost Center],
    SiteLoc1.Region as [Region],
    SiteLoc1.SubRegion as [Sub Region],
    -- SiteLoc2.Descr as [Location Description], **Need this though returning all for the location?
    CASE WHEN SAR.FieldId = '604NU' and SAR.FieldValue <> 'False' THEN 'YES' ELSE 'NO' END as [SAR Required],
    Summary as [Incident Summary],
    Disposition as [Case Disposition],
    AccNum.FieldValue,
    FORMAT(AuditItemDetail.ItemValue, '#,###') as [Potential Loss],
    FORMAT(AuditItemDetail.ItemValue - AuditItemDetail.PreventedExposureAmount, '#,###') as [Actual Loss]
FROM Incident
INNER JOIN ALCategoryVW ON ALCategoryVW.IncidentId = Incident.Id
INNER JOIN InAssign ON InAssign.IncidentId = Incident.Id
INNER JOIN SiteLoc1 ON SiteLoc1.Id = Incident.LocId
INNER JOIN SiteLoc2 ON SiteLoc2.SiteLoc1Id = SiteLoc1.Id
INNER JOIN IncidentFieldValuesVW SAR ON SAR.IncidentId = Incident.Id
INNER JOIN InItem ON InItem.IncidentId = Incident.Id
INNER JOIN AuditItemDetail ON AuditItemDetail.ItemId = InItem.ItemId
INNER JOIN InPerson ON InPerson.IncidentId = Incident.Id
LEFT JOIN PersonFieldValuesVW AccNum ON AccNum.PersonId = InPerson.PersonId AND AccNum.FieldDescr like '%Account Number%'

***根据评论更新。