powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Помогите с объединением запроса.
9 сообщений из 9, страница 1 из 1
Помогите с объединением запроса.
    #34355233
Tecak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Помогите начинающему в освоении SQL.
Как сделать чтобы все было в одном запросе?
Т.е. отображались поля p.naim,m.pole7,m.pole12

select p.naim,m.pole7 from plat p, mes_pl m
where p.sdog=m.sdog and m.pole4 between "01.02.2007" and "28.02.2007"'

select p.naim,m.pole12 from plat p, mes_pl m
where p.sdog=m.sdog and m.pole4 between "01.01.2007" and "31.01.2007"'
...
Рейтинг: 0 / 0
Помогите с объединением запроса.
    #34355261
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. неясно сформулирована задача. Если просто надо объединить результаты 2 запросов, то через UNION, если надо все вместе, то почему не объединить временные интервалы
2. неплохо бы указывать БД. Например, в Oracle мало того, что не двойные, а одинарные кавычки при задании дат, дык еще могут быть проблемы с преобразованием строки в дату (зависит от установок сессии) - это, конечно, если pole4 имеет тип date
...
Рейтинг: 0 / 0
Помогите с объединением запроса.
    #34355297
Tecak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да именно, надо все вместе, т.е. чтобы отображались и pole7 и pole12.
БД FoxPro, а я ее юзаю с Delphi. База и прога к ней написаны давно и не мной, мне надо сейчас сделать выборку и отчет.
Там такое дело: нужно отобразить значение pole7 назовем "оплата в текущем месяце" и pole12 назовем "долг за прошлый месяц". А в pole4 как раз и записаны даты.
...
Рейтинг: 0 / 0
Помогите с объединением запроса.
    #34355369
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, ну что значит "вместе"?
Если так
naim pole7
naim pole7
.....
naum pole12
naim pole12
т.е. сначала все строки с pole7 за тек. месяц, а потом строки с pole12 за предыдущий, то 2 запроса объединяются по UNION

Если надо так
naim pole7 pole12
т.е. pole7 и pole12 в одной строке, то можно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT Cur.naim, Cur.pole7, Prev.pole12
FROM
(
SELECT p.naim, m.pole7, p.sdog 
FROM plat p, mes_pl m, 
WHERE p.sdog=m.sdog and m.pole4 between "01.02.2007" and "28.02.2007"'
) Cur,
(
SELECT p.naim,m.pole12, p.sdog
FROM plat p, mes_pl m
where p.sdog=m.sdog and m.pole4 between "01.01.2007" and "31.01.2007"'
) Prev
WHERE Cur.sdog = Prev.sdog
1. Приведенный текст будет работать (с точностью до указания дат) в Oracle. Как работает с подзапросами FoxPro, спрашивай в соответствующем форуме.
2. Если может быть ситуация, когда строка за тек. месяц есть, а за предыдущий нет или наоборот - читай про OUTER JOIN
...
Рейтинг: 0 / 0
Помогите с объединением запроса.
    #34355540
Tecak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Надо именно тот случай для которого вы написали код.
Но при попытке реализовать в Delphi выдается ошибка
Invalid keyword Token select Line 4.
Не нравиться в четвертой строке select.
...
Рейтинг: 0 / 0
Помогите с объединением запроса.
    #34355583
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надеюсь, синтаксические ошибки, которые вкрались при copy + paste исправил? :)
Например,
FROM plat p, mes_pl m, -- не нужна вторая запятая
"01.02.2007" and "28.02.2007"' -- лишний последний апостроф

Вообще, если работаешь с базой, запрос лучше отладить на "родном" инструменте самой базы (например, для Oracle - sql*plus), а затем уже запихивать в программу
...
Рейтинг: 0 / 0
Помогите с объединением запроса.
    #34356419
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Автор
Делай всё в один запрос - условия на дату указывай через OR, выбор нужного столбца в SELECT-листе делай посредством CASE.
...
Рейтинг: 0 / 0
Помогите с объединением запроса.
    #34356424
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бабичев Сергей2Автор
Делай всё в один запрос - условия на дату указывай через OR, выбор нужного столбца в SELECT-листе делай посредством CASE.
Ну или если на примере проиллюстрировать, то должно быть что-то вроде такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select p.naim,
       case 
         when m.pole4 between "01.02.2007" 
                          and "28.02.2007"
           then m.pole7 
         when m.pole4 between "01.01.2007" 
                          and "31.01.2007"
           then m.pole12
       end as pole7_or_pole12  
  from plat p, mes_pl m
 where p.sdog=m.sdog 
   and (
         m.pole4 between "01.02.2007" 
                     and "28.02.2007"
         or
         m.pole4 between "01.01.2007" 
                     and "31.01.2007"
       )
Если интервалы и в самом деле непрерывные, то имеет смысл просто указать условие на вхождение данных в один большой интервал (where m.pole4 between " 01.02 .2007" and " 31.01 .2007"). Логика select-листа при этом не изменится (всё тот же CASE)
...
Рейтинг: 0 / 0
Помогите с объединением запроса.
    #34356630
Tecak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо
tru55,
Бабичев Сергей.

То tru55 да нет все проверил - все правильно. Не хочет его Delphi выполнять.
То Бабичев Сергей - Тоже Delphi ругается на 3-ю строчку оператор when.

Может это из-за того, что Local SQL для Delphi не знает про CASE в отличии от Oracle?
Выбор операторов для Local SQL весьма скромен
http://www.soft32.ru/delphi.shtml?topic=db&title=local_sql
Может еще можно как-то выбрать?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Помогите с объединением запроса.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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