Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2018, 21:13   #1
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию Помогите составить SQL (ADO, Access) запрос для сравнения двух таблиц.

Помогите составить SQL (ADO, Access) запрос для сравнения двух таблиц.
Есть две таблицы. Main и Old. Поля в них одинаковые.
http://programmersforum.ru/attachmen...1&d=1518113141
http://programmersforum.ru/attachmen...1&d=1518113206

Нужно выбрать из таблицы Old category, model, color чтобы соответсвовали полям category, model, но отличались полем color относительно таблицы Main...

Результат должен быть такой.
http://programmersforum.ru/attachmen...1&d=1518113223
Спасибо.
Изображения
Тип файла: png Безымянный1.png (8.8 Кб, 106 просмотров)
Тип файла: png Безымянный2.png (8.6 Кб, 108 просмотров)
Тип файла: png Безымянный3.png (3.4 Кб, 106 просмотров)

Последний раз редактировалось yorri; 08.02.2018 в 21:25. Причина: Ошибка
yorri вне форума Ответить с цитированием
Старый 08.02.2018, 23:01   #2
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию

Сделалось так. Не знаю, соответствует ли SQL-феншую, но как будто работает.

SELECT category, model, color FROM old WHERE old.color NOT IN (SELECT color FROM main WHERE old.category=main.category and old.model=main.model) and old.category IN (SELECT category FROM main WHERE old.model=main.model) and old.model IN (SELECT model FROM main WHERE old.category=main.category) group by category, model, color

Возможно есть более изящные варианты, но я их не нашел.
yorri вне форума Ответить с цитированием
Старый 09.02.2018, 09:45   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
select old.....
from old
inner join --потребуем обязательного наличия "обобщенной" записи в main (то бишь есть model, category )
          ( select model, category
            from main 
            group by model, category 
          ) as grp on old.category =grp.category and old.model =grp.model                 

left join main --поставим ВСЕМ (ранее полученным) записям из old точные копии main (если есть) 
               on old.category =main.categоry and old.model =main.model and old.color =main.color

where main.color is null -- и отберем то для чего копии нет
--- если оно еще надо будет group by ....
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 09.02.2018 в 09:49.
evg_m на форуме Ответить с цитированием
Старый 09.02.2018, 12:52   #4
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию

Спасибо! Вечером попробую. Я бы такого не "вывернул" :-).
Я пробовал через join, но мои познания в SQL не так глубоки как Ваши.
yorri вне форума Ответить с цитированием
Старый 09.02.2018, 17:23   #5
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
select old.....
from old
inner join --потребуем обязательного наличия "обобщенной" записи в main (то бишь есть model, category )
          ( select model, category
            from main 
            group by model, category 
          ) as grp on old.category =grp.category and old.model =grp.model                 

left join main --поставим ВСЕМ (ранее полученным) записям из old точные копии main (если есть) 
               on old.category =main.categоry and old.model =main.model and old.color =main.color

where main.color is null -- и отберем то для чего копии нет
--- если оно еще надо будет group by ....
Написал так:
Код:
select old.category, old.model, old.color 
from old

inner join (select main.model, main.category from main group by main.model, main.category) as grp
on old.category = grp.category and old.model = grp.model

left join main on old.category = main.category and old.model = main.model and old.color=main.color

where main.color is nul
l
Пишет Синтаксическая ошибка (отсутсвует оператор)...
и выделяет (я тестирую через Access) кусочер подчеркнутый в коде

Последний раз редактировалось yorri; 09.02.2018 в 19:47.
yorri вне форума Ответить с цитированием
Старый 09.02.2018, 20:21   #6
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Я бы взял в скобки:
Код:
on (old.category = grp.category and old.model = grp.model)
Black Fregat вне форума Ответить с цитированием
Старый 09.02.2018, 20:46   #7
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Я бы взял в скобки:
Код:
on (old.category = grp.category and old.model = grp.model)
если в скобки, тогда Синтаксическая ошибка (отсутствует оператор) в выражении " (notmain.category = grp.category and notmain.model = grp.model) left join main on notmain.category =main.categоry and notmain.model =main.model and notmain.a_color =main.a_color where main.a_color is null"
yorri вне форума Ответить с цитированием
Старый 09.02.2018, 20:48   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А так
Код:
from (old

inner join (select main.model, main.category from main group by main.model, main.category) as grp
on old.category = grp.category and old.model = grp.model)

left join main on old.category = main.category and old.model = main.model and old.color=main.color
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.02.2018, 20:50   #9
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию

В принципе, технически меня устраивает мой вариант, но хотелось бы все таки попробовать способ от evg_m, так как есть подозрение, что его способ будет работать быстрее (что то мне так кажется).
Мой запрос "думает" около 20-25 секун.
База Main около 6000 записей, Old - 3500.
yorri вне форума Ответить с цитированием
Старый 09.02.2018, 20:55   #10
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А так
Код:
from (old

inner join (select main.model, main.category from main group by main.model, main.category) as grp
on old.category = grp.category and old.model = grp.model)

left join main on old.category = main.category and old.model = main.model and old.color=main.color
Ошибка: Указаное поле "main.category" могло ссылаться на несколько таблиц...
yorri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос из двух таблиц SERG1980 БД в Delphi 8 18.11.2010 23:05
Запрос на сравнение записей двух таблиц. papos SQL, базы данных 0 25.09.2010 12:31
Запрос из двух таблиц T@tali Microsoft Office Access 0 18.05.2010 21:32
sql запрос на выборку записей из двух связанных таблиц Люсьен БД в Delphi 9 20.04.2009 16:07
SQL запрос из двух таблиц.(сложный) Miha87 БД в Delphi 5 10.11.2008 11:04