2015-10-15 2 views
1

Я использую MS Visual Studio 2012. У меня возникла проблема с записью подзапроса. Это весь запрос следующим образом:SSRS «Подзапрос вернул более одного значения»

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; 

, а затем я получаю ошибку

Subquery вернулся более чем на 1 значение. Это недопустимо, если подзапрос следует за =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

+1

В сообщении об ошибке указано все, у вас есть по крайней мере на суб-выбор, который возвращает более 1 строки. Это недопустимо в списке выбора. Вместо этого используйте JOINS. – jarlh

+0

Вы ищете для отладки справки, которая не соответствует теме StackOverflow. Как указано в jarlh, сообщение об ошибке содержит всю информацию, необходимую для решения проблемы, кроме того, поиск сообщения об ошибке даст вам много результатов. – Pred

ответ

0

При столкновении с этой ошибкой попробуйте выполнить подзапросы индивидуально, и если будет возвращено более одной записи, уточните условия, чтобы обеспечить возврат только одной записи.

Конечно, если требуется более одной записи, вам нужно изменить свой запрос, чтобы использовать соединение вместо подзапроса.

+1

Или, если подзапрос возвращает один столбец, используйте 'IN' вместо '=' –

1

Где проблема?

Проблема в том, что один из ваших подзапросов возвращает более одного значения (ЭТО, ОПИСАНИЕ ОШИБКИ ГОВОРИТ, ЧТО).

Как найти какой?

Попробуйте прокомментировать каждый подзапрос в своем заявлении выбора, пока ваш запрос не будет работать нормально.

Как это исправить?

Это, вероятно, лучший случай для использования 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