powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite подзапрос
7 сообщений из 7, страница 1 из 1
SQLite подзапрос
    #35378771
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть Необходимость в запросе такого вида?
Код: 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
SQLite подзапрос
    #35378777
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mikeПод Oracle такое работает нормально.Не твоя правда. В Oracle такое по определению работать не может, ибо в нем не поддерживаются коррелированные встроенные представления. Глючный релиз 10.2.0.1 (кажись, точно не помню) не в счет. Тынц , если что


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

misha mikeЧто тут можно поделать?Открыть для себя внешние соединения, коррелированные подзапросы, [NOT] EXISTS-подзапросы
А можно для идиотов разжевать чем тут помогут внешние соединения (присоедененных таблиц типа B в общем случае несколько) и особенно [NOT] EXISTS-подзапросы?
...
Рейтинг: 0 / 0
SQLite подзапрос
    #35381139
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQLite подзапрос
    #35381577
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQLite подзапрос
    #35381578
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQLite подзапрос
    #35383520
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бабичев СергейВозможно тем, что кроме колонки 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
7 сообщений из 7, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite подзапрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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