powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / union'ы и как с ними бороться
16 сообщений из 16, страница 1 из 1
union'ы и как с ними бороться
    #32553333
BobrovDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос такой: записей в таблице около 30000
Из них нужно выбрать, около 6000 записей. Идут они не по порядку. По первичному ключу не отсортируешь, признака, по которому их можно было отфильтровать и выбрать, тоже никакого нет. Просто 6000 тысяч, и именно их нужно выбрать, т.е скажем 1 запись, потом 35,
потом 247 итд.
Пока это делается посредством кривых рук так:
select ID,NAME FROM MYTABLE
WHERE ID=1
UNION
select ID,NAME FROM MYTABLE
WHERE ID=35
... и так далее...
Понятное дело , это не самый оптимальный вариант, кто может предложить что - либо более существенное?
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32553343
Dremuchij Forester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно так:
Код: plaintext
1.
2.
3.
SELECT ID, NAME FROM MYTABLE
 WHERE ID =  1 
  OR ID =  35 
  OR ID = ...
или так:
Код: plaintext
1.
SELECT ID, NAME FROM MYTABLE
 WHERE ID IN ( 1 ,  35 , ...)
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32553344
Dremuchij Forester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно так:
Код: plaintext
1.
2.
3.
SELECT ID, NAME FROM MYTABLE
 WHERE ID =  1 
  OR ID =  35 
  OR ID = ...
или так:
Код: plaintext
1.
SELECT ID, NAME FROM MYTABLE
 WHERE ID IN ( 1 ,  35 , ...)
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32553354
BobrovDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dremuchij Forester
Большое спасибо, сегодня попробую.
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32553491
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если борьба за скорость, то можно по-другому....
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32553549
Dremuchij Forester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Johnmen
Ну уже договаривай как. Скорость - это всегда гут.
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32553581
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dremuchij Forester
>Ну уже договаривай как.

Я думал, что это несложно додумать...:)
Реализация проста.
Создается таблица ("временная"), в поле F которой прописываются те самые значения.
Выполняется запрос с внутренним соединением осн.табл.с "временной" по полям T.ID и F.
Получен интересующий нас НД.
"Временную" таблицу окисляем (или зачищаем), смотря что выгоднее...
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32553742
BobrovDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, господа, не все так просто...
Вопрос вот в чем.
Нужно так:
select ID, NAME FROM MYTABLE
WHERE ID=1
OR ID =5
OR ID=4
OR ID=7
OR ID=6
Цифры идут не по-порядку ,а при помощи конструкции OR, в результате получаю:
1 ww
4 qq
5 zz
6 xx
7 cc
а нужно:
1 ww
5 zz
4 qq
7 cc
6 xx
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32553792
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер не гарантирует тебе порядок вывода строк, если ты не указываешь в order by по какому критерию должна быть упорядочена выборка. Если такого критерия в структуре не предусмотрено, надо думать над структурой. Вообще посоветую изучить sql. Грабер тебе поможет.

Удачи.
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32553841
Dremuchij Forester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Johnmen
Ага, будет быстрее, но как - то геморно это
INSERT INTO A
SELECT FROM B INNER JOIN A
DELETE FROM A
(ИМХО)

2 BobrovDm
1. В постановке вопроса требования к порядку не было.
2. Не уверен, но по-моему, вариант с UNION тоже не дает порядка по перечислению. А может я и Dremuchij.
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32557316
BobrovDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лентяй, спасибо за совет.
Свою проблему я решил, несмотря на криворукость...
Но вопрос все же остался. Попробую поставить вопрос по иному.
Есть ли такой оператор, который позволяет выводить поля таблицы в том порядке, в котором они заданы в запросе? Без создания каких либо доп. таблиц, писания процедур ит.д...
Конструкции ...OR...., ...where ID in...., union такого порядка не дают
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32557329
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно создать таблицу номеров ID выборки и номера прорядка выборки
и сделать SELECT через эту таблицу с ORDER BY по эго порядковым номерам...

Причем порядок и количество номеров можно спокойно менять в этой таблице.
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32557394
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть вариант такой:
Код: plaintext
1.
SELECT ID, STRPOS(',' || ID || ',', ',5,8,11,9,' )FROM TABLE1 WHERE 
 ID IN ( 5 , 8 , 11 , 9 ) ORDER BY  2 

STRPOS можно взять из rFunc
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32557705
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
 2  Лентяй, спасибо за совет.
Свою проблему я решил, несмотря на криворукость...
Но вопрос все же остался. Попробую поставить вопрос по иному.
Есть ли такой оператор, который позволяет выводить поля таблицы в том порядке, в котором они заданы в запросе? Без создания каких либо доп. таблиц, писания процедур ит.д...
Конструкции ...OR...., ...where ID in...., union такого порядка не дают

Поля-то как раз и выводяться в том порядке, в котором перечислены. А вот строки... Вообщем если нет поля по которому можно упорядочить выборку, то нужно его искусственно создать. Один вариант тебе уже предложили.

Если хочеться без UDF обойтись то можно извратиться так примерно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Select  1 , fld2, fld2 ... from tbl where id =  5 
union
Select  2 , fld2, fld2 ... from tbl where id =  8 
union
Select  3 , fld2, fld2 ... from tbl where id =  11 
union
Select  4 , fld2, fld2 ... from tbl where id =  9 
Order By  1 

Но я бы всетаки доп. табличку для сортировки завел или сортировал выборку на клиенте...

Удачи.
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32557838
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лентяй Если хочеться без UDF обойтись то можно извратиться так примерно
В Firebird 1.5 можно так не извращаться, а использовать CASE. Тогда union будут не нужны.
...
Рейтинг: 0 / 0
union'ы и как с ними бороться
    #32557957
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreemanZAV В Firebird 1.5 можно так не извращаться, а использовать CASE. Тогда union будут не нужны.

Да, с CASE поэлегантнее получиться.

Удачи.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / union'ы и как с ними бороться
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]