Страница 1 из 1
UNION, ORDER BY и GROUP BY + процедуры
Добавлено: 11 июн 2009, 01:43
AnnB
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.
У меня не работает.
Re: UNION, ORDER BY и GROUP BY + процедуры
Добавлено: 11 июн 2009, 11:49
Dimitry Sibiryakov
А у меня - работает. Чудо?
Re: UNION, ORDER BY и GROUP BY + процедуры
Добавлено: 12 июн 2009, 02:32
AnnB
Уважаемый Дмитрий, я понимаю вашу иронию, хотя и не понимаю к чему она, но всё-таки хотя бы примера синтаксиса про п.1 хотелось бы посмотреть. У меня одни и те же сложные процедуры и я не испытываю проблем с ними ни в MS SQL, ни в Postgre ни в MySQL. Магия?
Re: UNION, ORDER BY и GROUP BY + процедуры
Добавлено: 12 июн 2009, 11:54
Dimitry Sibiryakov
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
Re: UNION, ORDER BY и GROUP BY + процедуры
Добавлено: 13 июн 2009, 03:20
AnnB
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 писал(а):
ЗЫ: чтобы не быть голословным:
Вопрос снят - как раз это работает. Запускал через провайдер, а не напрямую, и база висла по другой причине. То есть это ошибка другого софта.
Re: UNION, ORDER BY и GROUP BY + процедуры
Добавлено: 13 июн 2009, 12:00
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 лучше воспитана.
Re: UNION, ORDER BY и GROUP BY + процедуры
Добавлено: 13 июн 2009, 12:59
AnnB
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.
Впрочем, не буду заставлять стойкого командира партизанского отряда выдать тайну.
Твоя помощь была просто неоценима )))
Re: UNION, ORDER BY и GROUP BY + процедуры
Добавлено: 13 июн 2009, 13:05
hvlad
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
AnnB писал(а):Однако там я могу просто перечислить столбцы в GROUP BY и проблема решится.Здесь я ничего подобного не наблюдаю и это раздражает
И что же ты наблюдаешь здесь ? После добавления отсутствующих колонок в GROUP BY ?
Re: UNION, ORDER BY и GROUP BY + процедуры
Добавлено: 14 июн 2009, 12:35
Dimitry Sibiryakov
AnnB писал(а):ограничение имён объектов 32 символами просто убивает.
Тогда в сторону Оракула вообще никогда не смотри - там ограничение в 30 байт.