Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / union'ы и как с ними бороться / 16 сообщений из 16, страница 1 из 1
09.06.2004, 04:21:07
    #32553333
BobrovDm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
Вопрос такой: записей в таблице около 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
09.06.2004, 05:43:41
    #32553343
Dremuchij Forester
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
Можно так:
Код: 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
09.06.2004, 05:44:41
    #32553344
Dremuchij Forester
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
Можно так:
Код: 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
09.06.2004, 06:29:25
    #32553354
BobrovDm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
Dremuchij Forester
Большое спасибо, сегодня попробую.
...
Рейтинг: 0 / 0
09.06.2004, 09:21:24
    #32553491
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
Если борьба за скорость, то можно по-другому....
...
Рейтинг: 0 / 0
09.06.2004, 10:07:22
    #32553549
Dremuchij Forester
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
2 Johnmen
Ну уже договаривай как. Скорость - это всегда гут.
...
Рейтинг: 0 / 0
09.06.2004, 10:20:39
    #32553581
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
>Dremuchij Forester
>Ну уже договаривай как.

Я думал, что это несложно додумать...:)
Реализация проста.
Создается таблица ("временная"), в поле F которой прописываются те самые значения.
Выполняется запрос с внутренним соединением осн.табл.с "временной" по полям T.ID и F.
Получен интересующий нас НД.
"Временную" таблицу окисляем (или зачищаем), смотря что выгоднее...
...
Рейтинг: 0 / 0
09.06.2004, 11:17:23
    #32553742
BobrovDm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
Нет, господа, не все так просто...
Вопрос вот в чем.
Нужно так:
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
09.06.2004, 11:34:58
    #32553792
Лентяй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
Сервер не гарантирует тебе порядок вывода строк, если ты не указываешь в order by по какому критерию должна быть упорядочена выборка. Если такого критерия в структуре не предусмотрено, надо думать над структурой. Вообще посоветую изучить sql. Грабер тебе поможет.

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

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

Причем порядок и количество номеров можно спокойно менять в этой таблице.
...
Рейтинг: 0 / 0
11.06.2004, 08:53:25
    #32557394
FreemanZAV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
Есть вариант такой:
Код: 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
11.06.2004, 11:14:12
    #32557705
Лентяй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
Код: 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
11.06.2004, 12:00:36
    #32557838
FreemanZAV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
Лентяй Если хочеться без UDF обойтись то можно извратиться так примерно
В Firebird 1.5 можно так не извращаться, а использовать CASE. Тогда union будут не нужны.
...
Рейтинг: 0 / 0
11.06.2004, 12:40:50
    #32557957
Лентяй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
union'ы и как с ними бороться
FreemanZAV В Firebird 1.5 можно так не извращаться, а использовать CASE. Тогда union будут не нужны.

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

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


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