2015-10-15 56 views
1

我正在使用MS Visual Studio 2012.我遇到了编写子查询的问题。这是整个查询,如下所示:SSRS“子查询返回的值超过1”

SELECT ACCOUNTNUM 
    , NAME 
    , ADDRESS 
    , PHONE 
    , TELEFAX 
    , INVOICEACCOUNT 
    , CUSTGROUP 
    , PAYMTERMID 
    , CURRENCY 
    , DIMENSION 
    , CELLULARPHONE 
    , STATISTICSGROUP 
    , PAYMMODE 
    , NAMEALIAS 
    , CONTACTPERSONID 
    , STREET 
    , PARTYID 
    , SEGMENTID 
    , TAXGROUP 
    , DATAAREAID 
    , ISNULL((
      SELECT PERCENT1 AS DiscCount 
      FROM PRICEDISCTABLE 
      WHERE (DATAAREAID = CUSTTABLE.DATAAREAID) 
       AND (ACCOUNTRELATION = CUSTTABLE.ACCOUNTNUM) 
      ), 0)/100 AS DiscCount 
    , (
     SELECT NAME 
     FROM CONTACTPERSON 
     WHERE (DATAAREAID = CUSTTABLE.DATAAREAID) 
      AND (CUSTACCOUNT = CUSTTABLE.ACCOUNTNUM) 
      AND (CONTACTPERSONID = CUSTTABLE.CONTACTPERSONID) 
     ) AS ContactName 
    , (
     SELECT PHONE 
     FROM CONTACTPERSON AS CONTACTPERSON_1 
     WHERE (DATAAREAID = CUSTTABLE.DATAAREAID) 
      AND (CUSTACCOUNT = CUSTTABLE.ACCOUNTNUM) 
      AND (CONTACTPERSONID = CUSTTABLE.CONTACTPERSONID) 
     ) AS ContactPhone 
    , ISNULL((
      SELECT STATGROUPNAME 
      FROM CUSTSTATISTICSGROUP 
      WHERE (DATAAREAID = CUSTTABLE.DATAAREAID) 
       AND (CUSTSTATISTICSGROUP = CUSTTABLE.STATISTICSGROUP) 
      ), 0) AS StatisticsName 
FROM CUSTTABLE 
WHERE CUSTGROUP = @ty 
    AND DATAAREAID = N'OTN' 
    AND STATISTICSGROUP LIKE @ss; 

,然后我得到的错误

子查询返回多个值。当 子查询遵循=,!=,<,< =,>,> =或当子查询用作 表达式时,这是不允许的。

+1

错误消息说明了这一切,至少在子选择上返回多于1行。这在选择列表中是不允许的。改为连接。 – jarlh

+0

您正在寻找在StackOverflow上偏离主题的调试帮助。正如jarlh所说,错误信息包含了解决问题所需的所有信息,而且,搜索错误信息将为您提供充足的结果。 – Pred

回答

0

遇到此错误时,请尝试单独运行子查询,如果返回多条记录,则优化条件以确保只返回一条记录。

当然,如果需要多个记录,则需要更改查询以使用联接而不是子查询。

+1

或者,如果子查询返回一列,则使用'IN'而不是'=' –

1

问题来自哪里?

问题是你的一个子查询返回多个值(HEY,ERROR DESCRIPTION SAYS THAT)。

如何找到哪一个?

尝试在您的select语句中注释每个子查询,直到您的查询正常工作。

如何解决?

这可能是使用CROSS APPLY的最佳情况。这将是您的查询:

SELECT ACCOUNTNUM 
    , NAME 
    , ADDRESS 
    , PHONE 
    , TELEFAX 
    , INVOICEACCOUNT 
    , CUSTGROUP 
    , PAYMTERMID 
    , CURRENCY 
    , DIMENSION 
    , CELLULARPHONE 
    , STATISTICSGROUP 
    , PAYMMODE 
    , NAMEALIAS 
    , CONTACTPERSONID 
    , STREET 
    , PARTYID 
    , SEGMENTID 
    , TAXGROUP 
    , DATAAREAID 
    , ISNULL(T1.DiscCount, 0)/100 AS DiscCount 
    , T2.ContactName 
    , T3.ContactPhone 
    , ISNULL(T4, 0) AS StatisticsName 
FROM CUSTTABLE 
CROSS APPLY (
    SELECT PERCENT1 AS DiscCount 
    FROM PRICEDISCTABLE 
    WHERE DATAAREAID = CUSTTABLE.DATAAREAID 
     AND ACCOUNTRELATION = CUSTTABLE.ACCOUNTNUM 
    ) AS T1 
CROSS APPLY (
    SELECT NAME 
    FROM CONTACTPERSON 
    WHERE DATAAREAID = CUSTTABLE.DATAAREAID 
     AND CUSTACCOUNT = CUSTTABLE.ACCOUNTNUM 
     AND CONTACTPERSONID = CUSTTABLE.CONTACTPERSONID 
    ) AS T2 
CROSS APPLY (
    SELECT PHONE 
    FROM CONTACTPERSON AS CONTACTPERSON_1 
    WHERE DATAAREAID = CUSTTABLE.DATAAREAID 
     AND CUSTACCOUNT = CUSTTABLE.ACCOUNTNUM 
     AND CONTACTPERSONID = CUSTTABLE.CONTACTPERSONID 
    ) AS T3 
CROSS APPLY (
    SELECT STATGROUPNAME 
    FROM CUSTSTATISTICSGROUP 
    WHERE DATAAREAID = CUSTTABLE.DATAAREAID 
     AND CUSTSTATISTICSGROUP = CUSTTABLE.STATISTICSGROUP 
    ) AS T4 
WHERE CUSTGROUP = @ty 
    AND DATAAREAID = N'OTN' 
    AND STATISTICSGROUP LIKE @ss; 

而且,这些可以被重写为简单的内部联接。

+1

良好的答案和详细的 – Lima

相关问题