Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Надо сделать 4 выборки - ерунда получается  [new]
Пытливый
Guest
Есть две таблицы А и В. В каждой есть по 4 поля. Ф,И,О - текст, Д-дата. Надо сравнить эти таблицы и выбрать из А:
1. Полные совпадения по ФИОД
2. Совпадения по ФИО и году от Д
3. Совпадения по ФИО
4. Отсутствие совпадений по трем предыдущим выборкам
Есть два обязательных условия
1: В каждой из выборок не должно быть данных трех других.
2: Выборки должны быть максимально быстрыми

Вроде бы все не сложно, играемся с джойнами и все... но вот не совпадает у меня сумма отдельных выборок с общей суммой хоть убейся.
8 мар 16, 11:13    [18907782]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Пытливый,

Ну так приведите ваш код
8 мар 16, 11:15    [18907788]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
Пытливый
но вот не совпадает у меня сумма отдельных выборок с общей суммой хоть убейся.
Что такое "сумма выборок"? И с общей "суммой" чего она не совпадает?
8 мар 16, 11:18    [18907795]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Glory
Member

Откуда:
Сообщений: 104751
Пытливый
Вроде бы все не сложно, играемся с джойнами и все...

Лучше поиграйтесь с EXCEPT/INTERSECT

Пытливый
1. Полные совпадения по ФИОД
2. Совпадения по ФИО и году от Д
3. Совпадения по ФИО
4. Отсутствие совпадений по трем предыдущим выборкам

Если соеденить результаты всех 4 этих выборок, то разве получится select * from A ?
8 мар 16, 11:52    [18907843]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Пытливый
Guest
Допустим в таблице А у меня 100 записей, из них 50 совпадают по ФИОД, 25 по ФИОГ, 20 по ФИО и 5 не совпадает. В итоге 100 по критериям = 100 исходных. А у меня так не получается черт его знает почему. Со вчерашнего дня сижу над вроде простыми запросами.
Фигня начинается, когда пытаешься учесть все 4 варианта в одной выборке.
Вот скажем я пробовал так для ФИОГ:
select F,I,O,D from A
inner join B on A.F=B.F and A.I=B.I and A.O=B.O and year(A.D)=year(B.D) and A.D<>B.D 

Получаем 25 записей.
делаю запрос по ФИОГ но иначе:
select F,I,O,D from A
inner join B on A.F=B.F and A.I=B.I and A.O=B.O and year(A.D)=year(B.D)
where id not in (select id from A
inner join B on A.F=B.F and A.I=B.I and A.O=B.O and A.D=B.D) 

получаю 29 записей
Очевидно что я где-то что-то не догоняю, но вот что - не пойму.
8 мар 16, 12:46    [18907911]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Glory
Member

Откуда:
Сообщений: 104751
Пытливый
Очевидно что я где-то что-то не догоняю, но вот что - не пойму.

Сделайте проще
Создайте в таблице А еще одно числовое поле indicator
Перепишите все ваши запросы select на update так, чтобы они обновляли indicator каким то номером, например 1, 2 и 3 с условием не обновлять записи с уже заполненным indicator.
8 мар 16, 12:51    [18907920]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Пытливый
Guest
Некое здравое зерно в этом есть, но не пойдет т.к. таблица Б изменяется в реальном времени и через пол часа там уже может не быть записи для которой мы выставим совпадение.
8 мар 16, 13:02    [18907939]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Glory
Member

Откуда:
Сообщений: 104751
Пытливый
Некое здравое зерно в этом есть, но не пойдет т.к. таблица Б изменяется в реальном времени и через пол часа там уже может не быть записи для которой мы выставим совпадение.

Ну так сделайте копию таблицы В
8 мар 16, 13:07    [18907947]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
o-o
Guest
тогда сделайте еще проще:
не работайте с таблицей, изменяющейся "в реальном времени".
скопируйте себе ее под другим именем и отлаживайте свой код на ней.
а когда он будет правильно работать,
все свои выборки сложите в 1 serializable-транзакцию,
чтобы никто данные не менял между соседними выборками.
а то никогда не сойдется
8 мар 16, 13:08    [18907952]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Пытливый
Guest
Glory весьма интересные штучки EXCEPT/INTERSECT. Жаль, что для меня это недоступно - работать надо под SQL Server 2000.
8 мар 16, 13:50    [18908035]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Пытливый
Guest
Так вроде начало прояснятся:
select F,I,O,D from A
inner join B on A.F=B.F and A.I=B.I and A.O=B.O and year(A.D)=year(B.D) and A.D<>B.D 

неправильный запрос, так делать низя
и еще надо distinct было добавить, совсем я не учитывал возможность нескольких повторов которые и давали лишние записи.
ПС: В общем вот что вышло:
-- Дубликаты по ФИОД
SELECT DISTINCT A.F, A.I, A.O, A.D
FROM A 
INNER JOIN B 
ON A.F=B.F AND A.I= B.I AND A.O= B.O AND A.D= B.D
ORDER BY A.F, A.I, A.O, A.D

-- Дубликаты по ФИОГ 
SELECT DISTINCT A.F, A.I, A.O, A.D
FROM A 
INNER JOIN B 
ON A.F= B.F AND A.I= B.I AND A.O= B.O AND YEAR(A.D)=YEAR(B.D)
WHERE ID NOT IN (SELECT ID
                    FROM A 
                    INNER JOIN B 
                    ON A.F= B.F AND A.I= B.I AND A.O= B.O AND A.D=B.D)
ORDER BY A.F, A.I, A.O, A.D

-- Дубликаты по ФИО 
SELECT DISTINCT A.F, A.I, A.O, A.D
FROM A 
INNER JOIN B 
ON A.F= B.F AND A.I= B.I AND A.O= B.O
WHERE ID NOT IN (SELECT ID
                    FROM A 
                    INNER JOIN B 
                    ON A.F= B.F AND A.I= B.I AND A.O= B.O AND YEAR(A.D)=YEAR(B.D))         
ORDER BY A.F, A.I, A.O, A.D

-- Новые 
SELECT DISTINCT A.F, A.I, A.O, A.D
FROM A 
LEFT JOIN B 
ON A.F= B.F AND A.I= B.I AND A.O=B.O
WHERE B.F IS NULL
ORDER BY A.F, A.I, A.O, A.D

теперь если сложить результаты по каждому запросу мы выйдем на количество в А, что и требовалось
8 мар 16, 15:53    [18908235]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Glory
Member

Откуда:
Сообщений: 104751
Пытливый
теперь если сложить результаты по каждому запросу мы выйдем на количество в А, что и требовалось

А это и было конечной целью всех этих запросов ?
Сложить на калькуляторе число записей, полученных в каждом из запросов ?
8 мар 16, 15:57    [18908239]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Пытливый
Guest
Нет конечно :)
Это проверка корректности выборок.
8 мар 16, 16:06    [18908245]     Ответить | Цитировать Сообщить модератору
 Re: Надо сделать 4 выборки - ерунда получается  [new]
Glory
Member

Откуда:
Сообщений: 104751
SELECT DISTINCT A.F, A.I, A.O, A.D,
CASE WHEN  A.D= B.D THEN 'Дубликаты по ФИОД' 
WHEN YEAR(A.D)=YEAR(B.D) THEN 'Дубликаты по ФИОГ'
WHEN B.F IS NOT NULL THEN 'Дубликаты по ФИО'
ELSE 'Новые'
END 
FROM A 
LEFT OUTER JOIN B 
ON A.F= B.F AND A.I= B.I AND A.O= B.O
8 мар 16, 16:14    [18908252]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить