Текущее время: Чт, июл 24 2025, 04:37

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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