Текущее время: Пт, июл 25 2025, 18:11

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Булево вычитание таблиц
СообщениеДобавлено: Пт, ноя 26 2010, 15:02 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, фев 16 2006, 15:46
Сообщения: 451
Откуда: Россия
Допустим есть таблицы TABA и TABB с одним ключевым полем NUM.

Какой наиболее простой способ получить булево вычитание? Т.е. значения из TABB, которых нет в TABA?

LEFT OUTER JOIN с условиями правой части не работает, увы.

Если считать, что в таблицах по миллионам записей, то писать в память тоже может быть накладно.

_________________
Ян Владимирович,
http://www.vladimirovich.net


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Булево вычитание таблиц
СообщениеДобавлено: Пт, ноя 26 2010, 15:05 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Использовать select TABA where NOT EXIST (select from TABB).

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Булево вычитание таблиц
СообщениеДобавлено: Пт, ноя 26 2010, 15:10 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, фев 16 2006, 15:46
Сообщения: 451
Откуда: Россия
А по памяти и быстродействию (таблицы большие) - вариант с NOT EXIST - оптимальный?

_________________
Ян Владимирович,
http://www.vladimirovich.net


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Булево вычитание таблиц
СообщениеДобавлено: Пт, ноя 26 2010, 15:12 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
LKU написал:
Использовать select TABA where NOT EXIST (select from TABB).

если в таблицах миллионы записей, то окончания запроса нынешнее поколение не дождется :)
NOT в WHERE по ключевому полю = полный перебор таблицы

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Булево вычитание таблиц
СообщениеДобавлено: Сб, ноя 27 2010, 12:38 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Сергей Королев написал:
LKU написал:
Использовать select TABA where NOT EXIST (select from TABB).

если в таблицах миллионы записей, то окончания запроса нынешнее поколение не дождется :)
NOT в WHERE по ключевому полю = полный перебор таблицы

Полный перебор, как минимум одной таблицы, задан условиями задачи - проверить ведь нужно каждое значение NUM!
В выражении же "NOT EXISTS ( SELECT..." поиск будет по ключу.
По-моему оптимальней вряд ли что то можно придумать.
Верьте в Oracle, он справится! :)

p.s.
...если это не кластерные таблицы

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Булево вычитание таблиц
СообщениеДобавлено: Сб, ноя 27 2010, 13:17 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Сергей Королев, задача была поставлена - сравнить таблицы, не загружая их на сервер приложений. Вот я и предложил селект, который это делает. Если мы боремся за быстродействие - вполне возможно быстрее будет зачитать все в память сервера приложений в сортированные таблицы и сравнивать бинарным поиском. Но не уверен...

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Булево вычитание таблиц
СообщениеДобавлено: Сб, ноя 27 2010, 14:02 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Да может вы и правы. На самом деле, мое мнение в основном продиктовано интуицией, а вообще-то надо бы попробовать сравнить на сотне тысяч записей запрос с NOT EXIST и программу с каким-нибудь циклом.

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Булево вычитание таблиц
СообщениеДобавлено: Сб, ноя 27 2010, 16:29 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
Думаю особых проблем здесь не будет
я только поменял названия таблиц для большей этюдности задачи

Теоретический алгоритм есть - отсортировать обе таблицы и идти параллельно по этим таблицам, выбирая записи которые есть в TABA но нет в TABB

Правильный SQL запрос для разности TABA - TABB будет:
SELECT * FROM TABA WHERE NOT EXISTS (SELECT * FROM TABB WHERE TABB.NUM = TABA.NUM)
Попробовал смоделировать пример на Access 2003 (субд Jet):
Code:
Option Compare Database

Sub PopulateTABA()
    CurrentDb.Execute ("DELETE FROM TABA")
    For I = 1 To 1000000
        CurrentDb.Execute ("INSERT INTO TABA ( NUM, DATA ) VALUES ( " + CStr(I) + ", 'A" + CStr(I) + "' )")
    Next I
    MsgBox "Готово!"
End Sub

Sub PopulateTABB()
    CurrentDb.Execute ("DELETE FROM TABB")
    For I = 1 To 1000000 Step 2
        CurrentDb.Execute ("INSERT INTO TABB ( NUM, DATB ) VALUES ( " + CStr(I) + ", 'B" + CStr(I) + "' )")
    Next I
    MsgBox "Готово!"
End Sub

Sub Subtract()
    CurrentDb.Execute ("DELETE FROM TABC")
    CurrentDb.Execute ("INSERT INTO TABC SELECT * FROM TABA WHERE NOT EXISTS (SELECT * FROM TABB WHERE TABA.NUM = TABB.NUM);")
    MsgBox "Готово!"
End Sub


Больше времени ушло на заполнение таблиц
А само получение вычитания TABC (со всеми четными записями из TABA) заняло 5 секунд!
Ноутбук 2.0 Ггц

ГЛАВНОЕ - чтобы обе таблицы имели индекс по ключу NUM (это соответствует их сортировке)
Думаю и в Oracle и в другой современной базе проблем не будет с такими запросами


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB