Подзапрос вернул более 1 значения ошибки sql - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь сделать запрос с подзапросом, в котором я хочу суммировать по идентификационному номеру.Но это дает мне ошибку: «Подзапрос вернул более 1 значения.Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения. '

Я уже пробовал это:

CREATE VIEW [dbo].[VW_Verblijfsobjecten_uitgeklapt]
AS
SELECT a.[Gemeentecode-AOB]
,a.[Code objecttypering-AOB]
,a.[Identificatie-AOB]
,a.[Gebruiksdoel]
,a.[Datum ontstaan-AOB]
,a.[Status code-AOB]
,a.[Buurtnaam]
,a.[Huisnummer]
,a.[Huisnummertoevoeging]
,a.[Postcode]
,a.[Identificatie-PND]
,a.[Geometrie]
,a.[Datum einde gebruik-AOB]
,a.[Einddatum-AOB]
,c.[DateValue]
,a.[Woonplaatsnaam]
,(SELECT COUNT(DISTINCT(b.[Identificatie-AOB]))
  FROM [Clean.VBO] as b
  WHERE b.[Datum ontstaan-AOB] <= c.[DateValue] 
  AND (b.[Gebruiksdoel] IN ('1', '111', '11141', '11161', '121', '131', '141', '151', '161', '181'))
  AND (b.[Status code-AOB] <> 82)  
  AND (b.[Datum einde gebruik-AOB] = '2999-01-01' OR b.[Datum einde gebruik-AOB] > c.[DateValue])
  GROUP BY b.[Woonplaatsnaam]) AS AantalWoningenInDeTijd
FROM [Clean.VBO] as a 
INNER JOIN [Clean.Peilkalender] as c
ON a.[Datum ontstaan-AOB] <= c.[DateValue]

Я ожидаю, что он подсчитывает идентификационный код на основе «woonplaatsnaam» вместо общего числа.

Ответы [ 5 ]

3 голосов
/ 27 марта 2019

Ваш подзапрос сгруппирован по б. [Woon ... невероятно длинный язык, который понимает никто не понимает]

Это приведет к (возможно) нескольким результатам в зависимости от столбца, по которому вы группируете. Это не разрешено в подзапросе в select или where части вашего оператора sql.

То, что вы можете сделать, чтобы получить желаемый результат, это поместить подзапрос в часть from вашего запроса. назначьте ему дескриптор и выполните правильное соединение по критериям, которые вы считаете подходящими. Полученное объединенное значение затем может быть использовано в выбранной вами части запроса.

SELECT a.x, b.y, c.z 
   FROM A a 
   INNER JOIN B b
   INNER JOIN (<subselect>) c 
                              ON a.a = c.a
   WHERE ...
2 голосов
/ 27 марта 2019

Сообщение об ошибке очень наглядно:

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

Предположим, вы хотите использовать оператор сравнения, который ожидает одно значение. Пример:

yourcolumn > (select yourcolumn2 from yourtable where yourcondition)

Теперь предположим, что ваш подзапрос вернет два значения: 5 и 7. Предположим далее, что в случае ваш столбец равен 6. Итак, это будет означать, что вам интересно знать, 6> (5, 7). Но как выполнить это сравнение? 6> 5 верно, но 6> 7 ложно. Так каким должен быть результат? Правда? Ложь? Ноль? Сложно определить. Не существует четко определенного способа оценить это выражение. Таким образом, для этих операторов вам понадобится один результат для ваших подзапросов. Есть случаи, когда не требуется иметь уникальный результат. Пример:

yourcolumn in (select yourcolumn2 from yourtable where yourcondition)

В этом случае вас интересует, находится ли значение внутри набора.

Ваш фактический запрос пытается вставить в таблицу. Значение поля определяется подзапросом, но если подзапрос имеет несколько результатов, то результат подзапроса амбивалентен и поэтому не может определить значение поля, которое является ограничителем показа.

Итак, в соответствии с вашими потребностями вам нужно будет справиться с ситуацией. Вы можете использовать свой групповой запрос как таблицу и присоединиться к ней. Или вы можете избежать группы по. Или вы можете быть уверены, что у вас будет одна группа для всех записей, которые будут вставлены через или где.

1 голос
/ 27 марта 2019

Я думаю, что ваш подзапрос должен быть присоединен к исходной таблице следующим образом:

 (SELECT COUNT(DISTINCT(b.[Identificatie-AOB]))
 FROM [Clean.VBO] as b
 WHERE a.[Woonplaatsnaam] = b.[Woonplaatsnaam] //added this line
 AND [Datum ontstaan-AOB] <= c.[DateValue] 
 AND (b.[Gebruiksdoel] IN ('1', '111', '11141', '11161', '121', '131', '141', '151', 
'161', '181'))
 AND (b.[Status code-AOB] <> 82)  
 AND (b.[Datum einde gebruik-AOB] = '2999-01-01' OR b.[Datum einde gebruik-AOB] > c. [DateValue])
 GROUP BY b.[Woonplaatsnaam]) AS AantalWoningenInDeTijd

Это называется Correlated Subquery и возвращает count для каждой строки в вашей исходной таблице через join

1 голос
/ 27 марта 2019

Я не совсем уверен, что понял, что вы хотите, но я думаю, вы можете получить то, что вам нужно, немного изменив подзапрос:

(SELECT COUNT(DISTINCT(b.[Identificatie-AOB]))
  FROM [Clean.VBO] as b
  WHERE b.[Datum ontstaan-AOB] <= c.[DateValue] 
  AND (b.[Gebruiksdoel] IN ('1', '111', '11141', '11161', '121', '131', '141', '151', '161', '181'))
  AND (b.[Status code-AOB] <> 82)  
  AND (b.[Datum einde gebruik-AOB] = '2999-01-01' OR b.[Datum einde gebruik-AOB] > c.[DateValue])
  AND (b.[Woonplaatsnaam] = a.[Woonplaatsnaam]) AS AantalWoningenInDeTijd -- Extend the condition instead of grouping by
)
1 голос
/ 27 марта 2019

удалить группу из подзапроса масштабатора

CREATE VIEW [dbo].[VW_Verblijfsobjecten_uitgeklapt]
AS
SELECT a.[Gemeentecode-AOB]
,a.[Code objecttypering-AOB]
,a.[Identificatie-AOB]
,a.[Gebruiksdoel]
,a.[Datum ontstaan-AOB]
,a.[Status code-AOB]
,a.[Buurtnaam]
,a.[Huisnummer]
,a.[Huisnummertoevoeging]
,a.[Postcode]
,a.[Identificatie-PND]
,a.[Geometrie]
,a.[Datum einde gebruik-AOB]
,a.[Einddatum-AOB]
,c.[DateValue]
,a.[Woonplaatsnaam]
,(SELECT COUNT(DISTINCT(b.[Identificatie-AOB]))
  FROM [Clean.VBO] as b
  WHERE b.[Datum ontstaan-AOB] <= c.[DateValue] 
  AND (b.[Gebruiksdoel] IN ('1', '111', '11141', '11161', '121', '131', '141', '151', '161', '181'))
  AND (b.[Status code-AOB] <> 82)  
  AND (b.[Datum einde gebruik-AOB] = '2999-01-01' OR b.[Datum einde gebruik-AOB] > c.[DateValue])

  ) 
  AS AantalWoningenInDeTijd
FROM [Clean.VBO] as a 
INNER JOIN [Clean.Peilkalender] as c
ON a.[Datum ontstaan-AOB] <= c.[DateValue]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...