Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Помогите написать запрос (число прочтений - 1524 )
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Помогите написать запрос
01. Июня 2012 :: 02:14
Печать  
Необходимо найти документы, с одинаковыми табличными частями(не больше строк, не меньше строк, порядок строк важен). Пусть таблица IDDOC,sp1,sp2,sp3,sp4.
MSSQL 2005.
Курсоры/временные таблицы/процедуры не предлагать.
Спасибо.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Помогите написать запрос
Ответ #1 - 01. Июня 2012 :: 04:28
Печать  
каким полем определяется порядок строк?
оно есть среди sp?
  

1&&2&&3
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите написать запрос
Ответ #2 - 01. Июня 2012 :: 04:47
Печать  
Ну давай подумаем:
1. находим все одинаковые строки (безотносительно документов):
Код
Выбрать все
(SELECT lineno_, sp1, sp2, sp3,sp4 from Doc group by lineno_, sp1, sp2, sp3,sp4 having count(*)>1) as t_1 


2. ну... например, джойним эту выборку с исходной таблицей и получаем количество строк
Код
Выбрать все
(SELECT d.iddoc, d.lineno_, d.sp1, d.sp2, d.sp3, d.sp4, COUNT(d.lineno_) as m_l from Doc d
LEFT JOIN ()  t_1 ON d.lineno_=t_1.lineno_, d.sp1=t_1.sp1, d.sp2=t_1.sp2, d.sp3=t_1.sp3, d.sp4=t_1.sp4
WHERE t_1.lineno_ IS NOT NULL
GROUP BY d.iddoc, d.lineno_, d.sp1, d.sp2, d.sp3, d.sp4) as d_1
 


3. Формируем выборку количества строк
Код
Выбрать все
(SELECT dd.iddoc, COUNT(dd.lineno_) as m_l FROM Doc dd GROUP BY dd.iddoc) as d_2 


4. Соединяем полученные выборки между собой
Код
Выбрать все
SELECT DISTINCT d_1.iddoc FROM () d_1 LEFT JOIN () d_2 ON d_1.iddoc-d_2.iddoc and d_1.m_l=d_2.m_l 

  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Помогите написать запрос
Ответ #3 - 01. Июня 2012 :: 04:59
Печать  
select
     Pairs.iddoc1 as iddoc1,
     Pairs.iddoc2 as iddoc2
from(
     select
           dt1.iddoc as iddoc1,
           dt2.iddoc as iddoc2,
           count(*)  as eqCount
     from dt dt1
     inner join dt dt2
            on dt1.iddoc != dt2.iddoc and dt1.lineno = dt2.lineno
           and dt1.sp1 = dt2.sp1 and dt1.sp2 = dt2.sp2 and dt1.sp3 = dt2.sp3 and dt1.sp4 = dt2.sp4
     group by dt1.iddoc, dt2.iddoc
) as Pairs
where Pairs.eqCount = (select count(*) from dt where dt.iddoc = Pairs.iddoc1)
  and Pairs.eqCount = (select count(*) from dt where dt.iddoc = Pairs.iddoc2)
  

1&&2&&3
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите написать запрос
Ответ #4 - 01. Июня 2012 :: 05:18
Печать  
твое кун-фу круче, чем мое кун-фу Улыбка
  
Наверх
ICQ  
IP записан
 
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Re: Помогите написать запрос
Ответ #5 - 04. Июня 2012 :: 02:03
Печать  
Спасибо)
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать