2015-10-15 95 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

相關問題