Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Алгоритм выборки  [new]
Евгений_Анатольевич
Member

Откуда:
Сообщений: 221
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

Товарищи, подскажите подалуйста грамотный алгоритм, а то всю голову уже сломал.. :(

Есть таблица А и таблица В. Нужно выбрать все строки из таблицы В, которые не встречаются в таблице А. Уникальных полей нет. Столбцов с данными больше десятка. Можно ли как-то это сделать эффективнее, чем прописывать через предикаты сравнение каждого столбца из таблицы В со столбцом таблицы А?

Как я вижу решение проблемы сейчас:
select * from B 
where c_b1 <> (select c_a1 from A) 
and c_b2 <> (select c_a2 from A) 
....
and (c_bn <> (select c_an from A)

под А и В понимаются результирующие таблицы, туда входят несколько объединений. Может вообще неверно представляю себе алгоритм?
27 окт 09, 09:18    [7842007]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм выборки  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Евгений_Анатольевич
Уникальных полей нет.
У вас что, нет первичных ключей?
27 окт 09, 09:19    [7842016]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм выборки  [new]
Евгений_Анатольевич
Member

Откуда:
Сообщений: 221
tpg
Евгений_Анатольевич
Уникальных полей нет.
У вас что, нет первичных ключей?


хм.. попробую немножко про предметную область. в таблицах А и В хранятся развернуте составы изделий. по сути есть 6 основных полей которые учавствуют в сравнении. номенклатурный номер тмц, номенклатурный номер блока куда входит тмц, и 4 поля различных количеств. в данном случае уникальное поле может быть только составным.. вы подтолкнули меня к идее.. может стоит создать временный уникальный составной ключ в этих таблицах и сравнить по нему?
27 окт 09, 09:25    [7842045]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм выборки  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SELECT *
FROM B
WHERE (SELECT COUNT(*) FROM (SELECT F1,F2,...,FN UNION SELECT F1,F2,...,FN FROM A) T)
    > (SELECT COUNT(*) FROM (SELECT DISTINCT F1,F2,...,FN FROM A) T);
??
Не проверял.

Только вот таблиц без PRIMARY KEY быть не должно. Совсем!
27 окт 09, 09:32    [7842075]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм выборки  [new]
aleks2
Guest
select B.*
FROM B LEFT OUTER JOIN A
ON
B.field1=A.field1
AND
B.field2=A.field2
...
AND
B.field10=A.field10
WHERE A.fieldX is null

fieldX - поле из field1..field10 которое НЕ могет быть NULL.
27 окт 09, 09:35    [7842084]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм выборки  [new]
Евгений_Анатольевич
Member

Откуда:
Сообщений: 221
iap

Только вот таблиц без PRIMARY KEY быть не должно. Совсем!

знаю, только вот обрабатывать приходится таблицы, которые формирует система. а она берет данные из БД где есть первичный ключ, но во временных таблицах не создает оного.. :(

спасибо за идею с количеством, тоже подумывал над этим. видимо это будет проще, чем создавать индекс на временные таблицы.. попробую реализовать!
27 окт 09, 09:40    [7842107]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм выборки  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Евгений_Анатольевич
попробую реализовать!
Готовьтесь к тормозам!
27 окт 09, 09:41    [7842113]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм выборки  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 629
Попробуйте как-то так:

Select *  from B
left join A on A.ID1 = B.ID1 and A.ID2 = B.ID2........
where A.ID1 is null

если у вас будет индекс хотя бы по ID1 уже все будет бегать довольно шустро...
27 окт 09, 09:48    [7842144]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм выборки  [new]
deto4ka
Member

Откуда: Пушкин
Сообщений: 215
select * from B
except
select * from A
В результат включаются только те строки, которые есть в В, но нет в А.
Поля таблиц должны быть совместимы. Для уверенности вместо * лучше написать список полей.
27 окт 09, 22:34    [7846879]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм выборки  [new]
aleks2
Guest
deto4ka
select * from B
except
select * from A
В результат включаются только те строки, которые есть в В, но нет в А.
Поля таблиц должны быть совместимы. Для уверенности вместо * лучше написать список полей.

А ничо что у тредстартера MS SQL 2000?
28 окт 09, 06:52    [7847359]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм выборки  [new]
Евгений_Анатольевич
Member

Откуда:
Сообщений: 221
Всем спасибо за помощь! Реализовал с помощью объединений.
28 окт 09, 08:52    [7847490]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить