Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite подзапрос / 7 сообщений из 7, страница 1 из 1
18.06.2008, 04:58
    #35378771
misha mike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite подзапрос
Есть Необходимость в запросе такого вида?
Код: plaintext
1.
2.
3.
4.
SELECT A.ID, BB.MaxData
FROM A,
     (SELECT MAX(B.Data) AS MaxData FROM B WHERE B.ID = A.ID) BB
WHERE A.ID <= ...
Но ругается на условие подзапроса, мотивируя тем, что "no such column: A.ID". Выходит что область видимости таблицы A не распространяется на подзапрос. Это так и должно быть или я что-то неправильно делаю? Под Oracle/FB/MsSQL такое работает нормально.

Конечно этот запрос можно привести к виду:
Код: plaintext
1.
2.
3.
4.
SELECT A.ID, BB.MaxData
FROM A,
     (SELECT MAX(B.Data) AS MaxData, B.ID FROM B GROUP BY B.ID) BB
WHERE (BB.ID = A.ID) AND (A.ID <= ...)
Если учесть что таблица B имеет миллион и более записей, то это будет полный капец!

Что тут можно поделать?
...
Рейтинг: 0 / 0
18.06.2008, 05:24
    #35378777
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite подзапрос
misha mikeПод Oracle такое работает нормально.Не твоя правда. В Oracle такое по определению работать не может, ибо в нем не поддерживаются коррелированные встроенные представления. Глючный релиз 10.2.0.1 (кажись, точно не помню) не в счет. Тынц , если что


misha mikeЧто тут можно поделать?Открыть для себя внешние соединения, коррелированные подзапросы, [NOT] EXISTS-подзапросы
...
Рейтинг: 0 / 0
18.06.2008, 14:08
    #35380156
misha mike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite подзапрос
Бабичев Сергей misha mikeПод Oracle такое работает нормально.Не твоя правда. В Oracle такое по определению работать не может, ибо в нем не поддерживаются коррелированные встроенные представления. Глючный релиз 10.2.0.1 (кажись, точно не помню) не в счет. Тынц , если что
Да, действительно, значит Oracle вычеркиваем. Но где-то я такое точно делал без проблем.

misha mikeЧто тут можно поделать?Открыть для себя внешние соединения, коррелированные подзапросы, [NOT] EXISTS-подзапросы
А можно для идиотов разжевать чем тут помогут внешние соединения (присоедененных таблиц типа B в общем случае несколько) и особенно [NOT] EXISTS-подзапросы?
...
Рейтинг: 0 / 0
18.06.2008, 18:37
    #35381139
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite подзапрос
misha mikeНо где-то я такое точно делал без проблем.Единственная база которое такое может делать это SQL Anywhere начиная с 9-ой версии и только при наличии специального типа связки таблиц - LATERAL.
В общем случае запросы такого вида невозможны.

misha mikeЧто тут можно поделать?Открыть для себя внешние соединения, коррелированные подзапросы, [NOT] EXISTS-подзапросы
А можно для идиотов разжевать чем тут помогут внешние соединения (присоедененных таблиц типа B в общем случае несколько) и особенно [NOT] EXISTS-подзапросы?[/quot]
И вообще, чем тебя не устраивает простой селект:
Код: plaintext
1.
2.
3.
select a.id, max(b.data)
from a, b
where a.id=b.id
group by a.id
Или я не правильно понял какие у тебя исходные таблицы?
...
Рейтинг: 0 / 0
19.06.2008, 05:55
    #35381577
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite подзапрос
misha mikeА можно для идиотов разжевать чем тут помогут внешние соединения (присоедененных таблиц типа B в общем случае несколько) и особенно [NOT] EXISTS-подзапросы?С Oracle знаком? Давай я тебе примерчик забацаю, надеюсь, ты поймешь о чем идет речь...

1) Использование NOT EXISTS-подзапроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
with
  a as
    (
      select  1  as id from dual union all
      select  2  as id from dual union all
      select  3  as id from dual
    ),
  b as
    (
      select  1  as id, to_date('01.06.2008','dd.mm.yyyy') as data from dual union all
      select  1  as id, to_date('05.06.2008','dd.mm.yyyy') as data from dual union all
      select  1  as id, to_date('07.06.2008','dd.mm.yyyy') as data from dual union all
      select  1  as id, to_date('10.06.2008','dd.mm.yyyy') as data from dual union all
      select  2  as id, to_date('04.06.2008','dd.mm.yyyy') as data from dual union all
      select  2  as id, to_date('06.06.2008','dd.mm.yyyy') as data from dual union all
      select  2  as id, to_date('20.06.2008','dd.mm.yyyy') as data from dual union all
      select  3  as id, to_date('12.06.2008','dd.mm.yyyy') as data from dual union all
      select  3  as id, to_date('15.06.2008','dd.mm.yyyy') as data from dual union all
      select  3  as id, to_date('25.06.2008','dd.mm.yyyy') as data from dual
    )
select a.id, b.data as maxdata
  from a
  join b on a.id = b.id
 where not exists (
                    select null
                      from b b1
                     where b1.id = b.id
                       and b1.data > b.data 
                  ) 

Query finished, retrieving results...

ID     MAXDATA
--   -----------
  1     10 -июн- 2008  
  2     20 -июн- 2008  
  3     25 -июн- 2008  

 3  row(s) retrieved

2) Использование левого внешнего соединения:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
with
  a as
    (
      select  1  as id from dual union all
      select  2  as id from dual union all
      select  3  as id from dual
    ),
  b as
    (
      select  1  as id, to_date('01.06.2008','dd.mm.yyyy') as data from dual union all
      select  1  as id, to_date('05.06.2008','dd.mm.yyyy') as data from dual union all
      select  1  as id, to_date('07.06.2008','dd.mm.yyyy') as data from dual union all
      select  1  as id, to_date('10.06.2008','dd.mm.yyyy') as data from dual union all
      select  2  as id, to_date('04.06.2008','dd.mm.yyyy') as data from dual union all
      select  2  as id, to_date('06.06.2008','dd.mm.yyyy') as data from dual union all
      select  2  as id, to_date('20.06.2008','dd.mm.yyyy') as data from dual union all
      select  3  as id, to_date('12.06.2008','dd.mm.yyyy') as data from dual union all
      select  3  as id, to_date('15.06.2008','dd.mm.yyyy') as data from dual union all
      select  3  as id, to_date('25.06.2008','dd.mm.yyyy') as data from dual
    )
select a.id, b.data as maxdata
  from a
  join b on a.id = b.id
  left outer join b b1 on b.id = b1.id
                      and b1.data > b.data
 where b1.id is null

Query finished, retrieving results...

ID     MAXDATA
--   -----------
  1     10 -июн- 2008  
  2     20 -июн- 2008  
  3     25 -июн- 2008  

 3  row(s) retrieved

3) Использование скалярного коррелированного подзапроса во фразе WHERE:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
with
  a as
    (
      select  1  as id from dual union all
      select  2  as id from dual union all
      select  3  as id from dual
    ),
  b as
    (
      select  1  as id, to_date('01.06.2008','dd.mm.yyyy') as data from dual union all
      select  1  as id, to_date('05.06.2008','dd.mm.yyyy') as data from dual union all
      select  1  as id, to_date('07.06.2008','dd.mm.yyyy') as data from dual union all
      select  1  as id, to_date('10.06.2008','dd.mm.yyyy') as data from dual union all
      select  2  as id, to_date('04.06.2008','dd.mm.yyyy') as data from dual union all
      select  2  as id, to_date('06.06.2008','dd.mm.yyyy') as data from dual union all
      select  2  as id, to_date('20.06.2008','dd.mm.yyyy') as data from dual union all
      select  3  as id, to_date('12.06.2008','dd.mm.yyyy') as data from dual union all
      select  3  as id, to_date('15.06.2008','dd.mm.yyyy') as data from dual union all
      select  3  as id, to_date('25.06.2008','dd.mm.yyyy') as data from dual
    )
select a.id, b.data as maxdata
  from a
  join b on a.id = b.id
 where (
         select max(data)
           from b
          where b.id = a.id 
       ) = b.data

Query finished, retrieving results...

ID     MAXDATA
--   -----------
  1     10 -июн- 2008  
  2     20 -июн- 2008  
  3     25 -июн- 2008  

 3  row(s) retrieved


Можно ещё придумать пару-тройку гибридных вариантов на основе вышеприведенных...
Так что, выбирай себе вариант в соответствии с возможностями своего сервера. :)
...
Рейтинг: 0 / 0
19.06.2008, 06:00
    #35381578
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite подзапрос
White OwlИ вообще, чем тебя не устраивает простой селект:
Код: plaintext
1.
2.
3.
select a.id, max(b.data)
from a, b
where a.id=b.id
group by a.id
Или я не правильно понял какие у тебя исходные таблицы?
Возможно тем, что кроме колонки DATA из таблицы B нужно извлечь и другие колонки (получить данные на последнюю дату). Это во-первых. Ну и во-вторых, на больших объемах данных группировка может сильно просадить производительность сервера.
...
Рейтинг: 0 / 0
19.06.2008, 17:53
    #35383520
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite подзапрос
Бабичев СергейВозможно тем, что кроме колонки DATA из таблицы B нужно извлечь и другие колонки (получить данные на последнюю дату). Это во-первых. Ну и во-вторых, на больших объемах данных группировка может сильно просадить производительность сервера.А он нигде про другие поля из второй таблицы не говорил.
А если так волнует производительность, можно еще поиграться с временными таблицами. Что-то вроде:
Код: plaintext
1.
2.
3.
4.
create temporary table tmp (id integer not null, maxdata integer null);
insert into tmp(id) select id from A where id<=....;
update tmp set maxdata = (select max(data) from B where tmp.id=B.id);
select * from tmp;
Хотя в том что это будет работать быстрее чем один селект с группировкой я не очень уверен. Все зависит от индексов...
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite подзапрос / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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