UNION, ORDER BY и GROUP BY + процедуры

Модераторы: kdv, CyberMax

Ответить
AnnB
Сообщения: 8
Зарегистрирован: 01 июн 2009, 06:44

UNION, ORDER BY и GROUP BY + процедуры

Сообщение AnnB » 11 июн 2009, 01:43

1)Подскажите плз пример правильного использования UNION с GROUP BY в каждом блоке из объединённых и ORDER BY для всех блоков объединённых этим оператором. Так и не нашёл нигде для своего сложного случая.
2) В этих блоках SELECT присутствует выборка значения из другой процедуры(я использовал функцию в PostgreSQL), но в каждом блоке передаются свои параметры типа

Код: Выделить всё

SELECT
a.qqq,
(SELECT * FROM mysubprocedure(a.eee)) AS fack
FROM t1 as a
UNION
 SELECT
b.qqq,
(SELECT * FROM mysubprocedure(b.eee)) AS fack
FROM t2 as b
Возможна ли такая конструкция в Interbase 7? И главное, мне нужна синтаксическая совместимость с Firebird 2.1.2.
У меня не работает.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: UNION, ORDER BY и GROUP BY + процедуры

Сообщение Dimitry Sibiryakov » 11 июн 2009, 11:49

А у меня - работает. Чудо?

AnnB
Сообщения: 8
Зарегистрирован: 01 июн 2009, 06:44

Re: UNION, ORDER BY и GROUP BY + процедуры

Сообщение AnnB » 12 июн 2009, 02:32

Уважаемый Дмитрий, я понимаю вашу иронию, хотя и не понимаю к чему она, но всё-таки хотя бы примера синтаксиса про п.1 хотелось бы посмотреть. У меня одни и те же сложные процедуры и я не испытываю проблем с ними ни в MS SQL, ни в Postgre ни в MySQL. Магия?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: UNION, ORDER BY и GROUP BY + процедуры

Сообщение Dimitry Sibiryakov » 12 июн 2009, 11:54

AnnB писал(а):Уважаемый Дмитрий, я понимаю вашу иронию, хотя и не понимаю к чему она
К тому, что "у меня не работает" это эмоции. Где сообщение об ошибке? Прочитайте уже статью "Как задавать вопросы".

По п.1: научись читать синтаксические диаграммы в Lanuage Reference и будет тебе счастье.

ЗЫ: чтобы не быть голословным:

Код: Выделить всё

SQL> select name, (select * from subproc) from a union select name, (select * from subproc) from b;

NAME
======================================== ============
AA                                                  1
BB                                                  1
CC                                                  1

AnnB
Сообщения: 8
Зарегистрирован: 01 июн 2009, 06:44

Re: UNION, ORDER BY и GROUP BY + процедуры

Сообщение AnnB » 13 июн 2009, 03:20

Dimitry Sibiryakov писал(а): По п.1: научись читать синтаксические диаграммы в Lanuage Reference и будет тебе счастье.
Я читал настолько что из 200 процедур проблемы возникли только в процедурах с использованием UNION.
Я умею читать. Чтобы не быть голословным приведу реальную процедуру.

Код: Выделить всё

CREATE  PROCEDURE yaf_user_accessmasks(
     i_BoardID INTEGER,
     i_UserID  INTEGER)
     RETURNS
     (
"AccessMaskID" integer,
"AccessMaskName" varchar(50),
"ForumID" integer,
"ForumName" varchar(128),
"CategoryID" integer,
"ParentID" integer
)
     AS
     BEGIN
    FOR SELECT  
     x.*
     FROM     (SELECT   e."AccessMaskID" AS "AccessMaskID",
     e."Name" AS "AccessMaskName",
     f."ForumID" AS "ForumID",
     f."Name" AS "ForumName",
     f."CategoryID",
	 f."ParentID"
     FROM     yaf_User a
     JOIN yaf_UserGroup b
     ON b."UserID" = a."UserID"
     JOIN yaf_Group c
     ON c."GroupID" = b."GroupID"
     JOIN yaf_ForumAccess d
     ON d."GroupID" = c."GroupID"
     JOIN yaf_AccessMask e
     ON e."AccessMaskID" = d."AccessMaskID"
     JOIN yaf_Forum f
     ON f."ForumID" = d."ForumID"
     WHERE    a."UserID" = :i_UserID
     AND c."BoardID" = :i_BoardID
     GROUP BY e."AccessMaskID",e."Name",f."ForumID",f."Name"
     
     UNION
     
     SELECT   c."AccessMaskID" AS "AccessMaskID",
     c."Name" AS "AccessMaskName",
     d."ForumID" AS "ForumID",
     d."Name" AS  "ForumName",
     d."CategoryID",
	 d."ParentID"
     FROM     yaf_User a
     JOIN yaf_UserForum b
     ON b."UserID" = a."UserID"
     JOIN yaf_AccessMask c
     ON c."AccessMaskID" = b."AccessMaskID"
     JOIN yaf_Forum d
     ON d."ForumID" = b."ForumID"
     WHERE    a."UserID" = :i_UserID
     AND c."BoardID" = :i_BoardID
     GROUP BY c."AccessMaskID",c."Name",d."ForumID",d."Name") AS x 
     ORDER BY x."ForumName",
     x."AccessMaskName",x."AccessMaskID",x."ForumID",x."CategoryID",
     x."ParentID"  
     INTO
     :"AccessMaskID",
     :"AccessMaskName",
     :"ForumID",
     :"ForumName",
     :"CategoryID",
     :"ParentID"
      DO SUSPEND;
     END )
Message: isc_dsql_prepare failed

SQL Message : -104
Invalid token

Engine Code : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
Dimitry Sibiryakov писал(а): ЗЫ: чтобы не быть голословным:
Вопрос снят - как раз это работает. Запускал через провайдер, а не напрямую, и база висла по другой причине. То есть это ошибка другого софта.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: UNION, ORDER BY и GROUP BY + процедуры

Сообщение Dimitry Sibiryakov » 13 июн 2009, 12:00

Партизан раскололся с двух пинков. Возможно, для него ещё не всё потеряно.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
И какое слово тебе тут непонятно? Если MS SQL, PGSQL и MySQL могут себе позволить выдать тебе случайное значение категории, то Firebird лучше воспитана.

AnnB
Сообщения: 8
Зарегистрирован: 01 июн 2009, 06:44

Re: UNION, ORDER BY и GROUP BY + процедуры

Сообщение AnnB » 13 июн 2009, 12:59

Dimitry Sibiryakov писал(а):Партизан раскололся с двух пинков. Возможно, для него ещё не всё потеряно.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
И какое слово тебе тут непонятно? Если MS SQL, PGSQL и MySQL могут себе позволить выдать тебе случайное значение категории, то Firebird лучше воспитана.
Гы... Postgre выдаст примерно тоже самое и также подробно, так что не надо. Я с этим постоянно сталкиваюсь. И Firebird пока до него скажем очень далековато. Хотя процедуры здесь мне нравятся своими возможностями, но ограничение имён объектов 32 символами просто убивает. Также странности с UTF-8, не буду перечислять всех недостатков. Однако там я могу просто перечислить столбцы в GROUP BY и проблема решится.Здесь я ничего подобного не наблюдаю и это раздражает, так как у меня остались две процедуры с этим UNION.
Впрочем, не буду заставлять стойкого командира партизанского отряда выдать тайну.
Твоя помощь была просто неоценима )))

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: UNION, ORDER BY и GROUP BY + процедуры

Сообщение hvlad » 13 июн 2009, 13:05

Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
AnnB писал(а):Однако там я могу просто перечислить столбцы в GROUP BY и проблема решится.Здесь я ничего подобного не наблюдаю и это раздражает
И что же ты наблюдаешь здесь ? После добавления отсутствующих колонок в GROUP BY ?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: UNION, ORDER BY и GROUP BY + процедуры

Сообщение Dimitry Sibiryakov » 14 июн 2009, 12:35

AnnB писал(а):ограничение имён объектов 32 символами просто убивает.
Тогда в сторону Оракула вообще никогда не смотри - там ограничение в 30 байт.

Ответить