houssem eddine ayari Ответов: 1

Подзапрос,возвращающий несколько строк


SQL0811 : Résultat de SELECT dépasse une ligne.
Cause . . . . . : La table résultante d'une instruction SELECT INTO, d'une sous-requête ou d'une sous-requête d'une instruction SET comporte plusieurs lignes. Il s'agit d'une erreur de type 2. Une erreur de ce type signale qu'une instruction SELECT INTO a tenté de retourner plusieurs lignes. Dans le cas d'une erreur de type 2, une sous-requête précédée d'un prédicat de base a produit plusieurs lignes. Or, une seule ligne est admise. Que faire . . . : Modifiez la requête de sorte qu'une seule ligne soit extraite, puis renouvelez votre demande. Pour traiter plusieurs lignes, vous devez utiliser les instructions DECLARE CURSOR, OPEN et FETCH ou, dans le cas d'une sous-requête, les prédicats IN, EXISTS, ANY ou ALL. L'extraction de plusieurs lignes est peut-être due à une erreur liée aux données (cas des lignes dupliquées, par exemple). (IBMDA400 Command)

Правка - перевод:
Цитата:
SQL0811 : результат выбора превышает одну строку.

Причины. . . . . : Таблицы в результате выбора в заявлении, вложенный запрос или подзапрос из набора инструкция имеет несколько строк. Это ошибка типа 2. Ошибка этого типа указывает на то, что оператор SELECT INTO пытался вернуть несколько строк.
В случае ошибки типа 2 подзапрос, которому предшествует базовый предикат, выдает несколько строк. Однако допускается только одна строка.
Что делать...: измените запрос так, чтобы была извлечена только одна строка, а затем повторите свой запрос. Для обработки нескольких строк необходимо использовать курсор DECLARE, инструкции OPEN и FETCH или, в случае подзапроса, предикаты IN, EXISTS, ANY или ALL.
Извлечение нескольких строк может быть вызвано ошибкой, связанной с данными (например, случай дублирования строк). (Команда IBMDA400)


Что я уже пробовал:

Я создаю различные подзапросы в select query, которые возвращают несколько строк, но у меня возникает проблема, что подзапрос возвращает только одну строку.

Эта проблема повторяется для каждого подзапроса.

SELECT Quittance.DTNUMEXE, Quittance.DTMOIEXE, Quittance.DTANNQIT, Quittance.DTMOIQIT, Quittance.DTCODBRC, Quittance.DTSERQIT, Quittance.DTPLCQTC,Quittance.DTCATPOL, Quittance.DTCODRSQ, Quittance.DTNATRSQ, Quittance.DTCODPRO, Quittance.DTTYPQIT, Quittance.DTLIBTYP, Quittance.DTCODETA, Quittance.DTLIBETA, Quittance.DTCODAGC, Quittance.DTNUMCLT, Quittance.DTNATCLT, Quittance.DTJJDVAL, Quittance.DTMMDVAL, Quittance.DTAADVAL,Quittance.DTJJFVAL, Quittance.DTMMFVAL, Quittance.DTAAFVAL, Quittance.DTCODART, Quittance.DTCODGRN, Quittance.DTPRMNET, Quittance.DTMNTACC, Quittance.DTJJEMIS, Quittance.DTMMEMIS, Quittance.DTAAEMIS, CASE WHEN Quittance.DTNUMCLT >= 50000 AND Quittance.DTNUMCLT <= 100000 THEN 'OUI' ELSE 'NON' END DTCLTIMP,
CASE UPPER(Quittance.DTPLCEXO) WHEN 'O' THEN 'OUI' WHEN 'N' THEN 'NON' END DTEXOTAX, Quittance.DTMNTCOM , (SELECT Garantie.VGFRNNBP FROM AUTOPRD.AUVCLGRPP0 AS Garantie where (Garantie.VGNUMPLC = Quittance.DTPLCQTC ) AND (Garantie.VGCODGRN= Quittance.DTCODGRN) AND (Garantie.VGJJOCCU * 1000000 + Garantie.VGMMOCCU * 100000000 + Garantie.VGAAOCCU * 10000000000 + Garantie.VGNUMAVT) IN (SELECT MAX(Garantie.VGJJOCCU * 1000000 + Garantie.VGMMOCCU * 100000000 + Garantie.VGAAOCCU * 10000000000 + Garantie.VGNUMAVT ) AS DATEOCC FROM AUTOPRD.AUVCLGRPP0 WHERE (Garantie.VGMMOCCU * 100000000 + Garantie.VGAAOCCU * 10000000000 <= (Quittance.DTAADVAL * 10000 + Quittance.DTMMDVAL * 100 + Quittance.DTJJDVAL)*1000000 ) AND (Garantie.VGNUMPLC =Quittance.DTPLCQTC) AND (Garantie.VGCODGRN= Quittance.DTCODGRN))), (SELECT Garantie.VGCPTPTN FROM AUTOPRD.AUVCLGRPP0 AS Garantie where (Garantie.VGNUMPLC = Quittance.DTPLCQTC ) AND (Garantie.VGCODGRN= Quittance.DTCODGRN) AND (Garantie.VGJJOCCU * 1000000 + Garantie.VGMMOCCU * 100000000 + Garantie.VGAAOCCU * 10000000000 + Garantie.VGNUMAVT) IN (SELECT MAX(Garantie.VGJJOCCU * 1000000 + Garantie.VGMMOCCU * 100000000 + Garantie.VGAAOCCU * 10000000000 + Garantie.VGNUMAVT ) AS DATEOCC FROM AUTOPRD.AUVCLGRPP0 WHERE (Garantie.VGMMOCCU * 100000000 + Garantie.VGAAOCCU * 10000000000 <= (Quittance.DTAADVAL * 10000 + Quittance.DTMMDVAL * 100 + Quittance.DTJJDVAL)*1000000 ) AND (Garantie.VGNUMPLC =Quittance.DTPLCQTC) AND (Garantie.VGCODGRN= Quittance.DTCODGRN)) )

FROM TRANSFERT.DTQTTNCPP1 AS Quittance

WHERE (Quittance.DTCODBRC = 1) AND (Quittance.DTCODGRN>0) AND (DTNUMEXE =2020)

Nelek

Это английский сайт, вы должны попытаться перевести текст, если хотите максимально использовать свои возможности для получения помощи

1 Ответов

Рейтинг:
2

#realJSOP

Чувак, научись форматировать свой код, чтобы мы могли его прочитать. Кроме того, вот ваш код отформатирован. Обратите внимание на комментарии:

SELECT Q.DTNUMEXE
       ,Q.DTMOIEXE
       ,Q.DTANNQIT
       ,Q.DTMOIQIT
       ,Q.DTCODBRC
       ,Q.DTSERQIT
       ,Q.DTPLCQTC
       ,Q.DTCATPOL
       ,Q.DTCODRSQ
       ,Q.DTNATRSQ
       ,Q.DTCODPRO
       ,Q.DTTYPQIT
       ,Q.DTLIBTYP
       ,Q.DTCODETA
       ,Q.DTLIBETA
       ,Q.DTCODAGC
       ,Q.DTNUMCLT
       ,Q.DTNATCLT
       ,Q.DTJJDVAL
       ,Q.DTMMDVAL
       ,Q.DTAADVAL
       ,Q.DTJJFVAL
       ,Q.DTMMFVAL
       ,Q.DTAAFVAL
       ,Q.DTCODART
       ,Q.DTCODGRN
       ,Q.DTPRMNET
       ,Q.DTMNTACC
       ,Q.DTJJEMIS
       ,Q.DTMMEMIS
       ,Q.DTAAEMIS
       ,CASE WHEN Q.DTNUMCLT >= 50000 AND Q.DTNUMCLT <= 100000 THEN 'OUI' ELSE 'NON' END AS DTCLTIMP
       ,CASE UPPER(Q.DTPLCEXO) WHEN 'O' THEN 'OUI' WHEN 'N' THEN 'NON' END AS DTEXOTAX
       ,Q.DTMNTCOM 
       ,(
	        -- this subquery can only return 1 value
            SELECT G.VGFRNNBP 
            FROM   AUTOPRD.AUVCLGRPP0 AS G 
            WHERE  (G.VGNUMPLC = Q.DTPLCQTC ) 
            AND    (G.VGCODGRN= Q.DTCODGRN) 
            AND    (G.VGJJOCCU * 1000000 + G.VGMMOCCU * 100000000 + G.VGAAOCCU * 10000000000 + G.VGNUMAVT) 
            	   IN (
            			  SELECT MAX(G.VGJJOCCU * 1000000 + G.VGMMOCCU * 100000000 + G.VGAAOCCU * 10000000000 + G.VGNUMAVT ) AS DATEOCC 
            			  FROM   AUTOPRD.AUVCLGRPP0 
            			  WHERE  (G.VGMMOCCU * 100000000 + G.VGAAOCCU * 10000000000 <= (Q.DTAADVAL * 10000 + Q.DTMMDVAL * 100 + Q.DTJJDVAL) * 1000000 ) 
            			  AND    (G.VGNUMPLC =Q.DTPLCQTC) AND (G.VGCODGRN= Q.DTCODGRN)
                      )
		) -- you neglected to specifyy the column name here 
       ,(
            -- this subquery can only return 1 value
	        SELECT G.VGCPTPTN 
			FROM   AUTOPRD.AUVCLGRPP0 AS G 
			WHERE  (G.VGNUMPLC = Q.DTPLCQTC ) 
			AND    (G.VGCODGRN= Q.DTCODGRN) AND (G.VGJJOCCU * 1000000 + G.VGMMOCCU * 100000000 + G.VGAAOCCU * 10000000000 + G.VGNUMAVT) 
			       IN (
                          SELECT MAX(G.VGJJOCCU * 1000000 + G.VGMMOCCU * 100000000 + G.VGAAOCCU * 10000000000 + G.VGNUMAVT ) AS DATEOCC 
                          FROM   AUTOPRD.AUVCLGRPP0 
                          WHERE  (G.VGMMOCCU * 100000000 + G.VGAAOCCU * 10000000000 <= (Q.DTAADVAL * 10000 + Q.DTMMDVAL * 100 + Q.DTJJDVAL) * 1000000 ) 
				          AND    (G.VGNUMPLC =Q.DTPLCQTC) 
				          AND    (G.VGCODGRN= Q.DTCODGRN)
					  ) 
		) -- you neglected to specifyy the column name here 
FROM  TRANSFERT.DTQTTNCPP1 AS Q
WHERE (Q.DTCODBRC = 1) 
AND   (Q.DTCODGRN>0) 
AND   (DTNUMEXE = 2020)