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

Откуда: Екатеринбург
Сообщений: 17722
sql 2005
есть такой набор таблиц (в реале это селекты )


create table t1  (id int,s1 nvarchar(10))
create table t2  (id int,s1 nvarchar(10))
create table t3  (id int,s1 nvarchar(10))

INSERT INTO t1 (id,s1) VALUES (79,'str1')  INSERT INTO t2 (id,s1) VALUES (79,'xxx1') INSERT INTO t3 (id,s1) VALUES (79,'eee1')
INSERT INTO t1 (id,s1) VALUES (79,'str2')  INSERT INTO t2 (id,s1) VALUES (79,'ddd1') INSERT INTO t3 (id,s1) VALUES (79,'sss1')
INSERT INTO t1 (id,s1) VALUES (79,'str3')                                            INSERT INTO t3 (id,s1) VALUES (79,'fgdf')
INSERT INTO t1 (id,s1) VALUES (79,'str4')
INSERT INTO t1 (id,s1) VALUES (79,'str5')                                            


INSERT INTO t1 (id,s1) VALUES (80,'str1')  INSERT INTO t2 (id,s1) VALUES (80,'xxx2') INSERT INTO t3 (id,s1) VALUES (80,'ttt1')
INSERT INTO t1 (id,s1) VALUES (80,'str2')  INSERT INTO t2 (id,s1) VALUES (80,'ddd2') 
INSERT INTO t1 (id,s1) VALUES (80,'str3')                                             
INSERT INTO t1 (id,s1) VALUES (80,'str4')


INSERT INTO t1 (id,s1) VALUES (81,'str1')  INSERT INTO t2 (id,s1) VALUES (81,'xxx3')
                                           INSERT INTO t2 (id,s1) VALUES (81,'ddd3') 

требуется получить такой набор (пустые строки только для читаемости)

79	str1	xxx1	eee1
79	str2	ddd1	sss1
79	str3	null	fgdf
79	str4	null	null
79	str5	null	null

80	str1	xxx2	ttt1
80	str2	ddd2	null
80	str3	null	null
80	str4	null	null

81	str1	xxx3	null
81	null	ddd3	null
5 дек 09, 19:45    [8024447]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
вадя,

ужасно интересно, по какому принципу строка (79,'xxx1') из t2 связывается со строкой (79,'str1') из t1, а строка (79,'ddd1') - с (79,'str2')? Из-за красиво отформатированных операций вставки? В лоб - можно например так:
select t1.id, t1.s1, t2.s1, t3.s1 from
(select *, ROW_NUMBER() over(partition by id order by (select 1)) N from t1) t1
left join (select *, ROW_NUMBER() over(partition by id order by (select 1)) N from t2) t2
		on t1.id = t2.id and t1.N = t2.N
left join (select *, ROW_NUMBER() over(partition by id order by (select 1)) N from t3) t3
		on t1.id = t3.id and t1.N = t3.N
5 дек 09, 20:30    [8024521]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
ё
Guest
это для 2000
для 2005, наверняка есть попроще
SELECT ISNULL(w.id, z.id) As id, w.xs, w.ys, z.s1 As zs
FROM (

SELECT ISNULL(x.id, y.id) As id, x.s1 As xs, y.s1 As ys, ISNULL(x.n, y.n)As n 
FROM

(SELECT a.id, a.s1, COUNT(*) As n
FROM t1 a
INNER JOIN t1 b
  ON    a.id = b.id 
    AND a.s1 >= b.s1
GROUP BY a.id, a.s1) x

FULL JOIN 

(SELECT a.id, a.s1, COUNT(*) As n
FROM t2 a
INNER JOIN t2 b
  ON    a.id = b.id 
    AND a.s1 >= b.s1
GROUP BY a.id, a.s1) y

ON x.id = y.id AND x.n = y.n) w

FULL JOIN 

(SELECT a.id, a.s1, COUNT(*) As n
FROM t3 a
INNER JOIN t3 b
  ON    a.id = b.id 
    AND a.s1 >= b.s1
GROUP BY a.id, a.s1) z

ON w.id = z.id AND w.n = z.n

ORDER BY id
5 дек 09, 20:37    [8024532]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17722
Сообщение 8156, уровень 16, состояние 1, строка 34
Столбец "N" для "t1" указан более одного раза.
Сообщение 8156, уровень 16, состояние 1, строка 34
Столбец "N" для "t2" указан более одного раза.
Сообщение 8156, уровень 16, состояние 1, строка 34
Столбец "N" для "t3" указан более одного раза.

все таблицы связаны по полю id

данные могут иметь и такой вид

drop table t1  
drop table t2  
drop table t3  

create table t1  (id int,n int,s1 nvarchar(10))
create table t2  (id int,n int,s1 nvarchar(10))
create table t3  (id int,n int,s1 nvarchar(10))

INSERT INTO t1 (id,n,s1) VALUES (79,1,'str1')  INSERT INTO t2 (id,n,s1) VALUES (79,1,'xxx1') INSERT INTO t3 (id,n,s1) VALUES (79,1,'eee1')
INSERT INTO t1 (id,n,s1) VALUES (79,2,'str2')  INSERT INTO t2 (id,n,s1) VALUES (79,2,'ddd1') INSERT INTO t3 (id,n,s1) VALUES (79,2,'sss1')
INSERT INTO t1 (id,n,s1) VALUES (79,3,'str3')                                                INSERT INTO t3 (id,n,s1) VALUES (79,3,'fgdf')
INSERT INTO t1 (id,n,s1) VALUES (79,4,'str4')
INSERT INTO t1 (id,n,s1) VALUES (79,5,'str5')                                            


INSERT INTO t1 (id,n,s1) VALUES (80,1,'str1')  INSERT INTO t2 (id,n,s1) VALUES (80,1,'xxx2') INSERT INTO t3 (id,n,s1) VALUES (80,1,'ttt1')
INSERT INTO t1 (id,n,s1) VALUES (80,2,'str2')  INSERT INTO t2 (id,n,s1) VALUES (80,2,'ddd2') 
INSERT INTO t1 (id,n,s1) VALUES (80,3,'str3')                                             
INSERT INTO t1 (id,n,s1) VALUES (80,4,'str4')


INSERT INTO t1 (id,n,s1) VALUES (81,2,'str1')  INSERT INTO t2 (id,n,s1) VALUES (81,1,'xxx3')
                                               INSERT INTO t2 (id,n,s1) VALUES (81,2,'ddd3') 
5 дек 09, 20:44    [8024540]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
вадя
Сообщение 8156, уровень 16, состояние 1, строка 34
Столбец "N" для "t1" указан более одного раза.
Сообщение 8156, уровень 16, состояние 1, строка 34
Столбец "N" для "t2" указан более одного раза.
Сообщение 8156, уровень 16, состояние 1, строка 34
Столбец "N" для "t3" указан более одного раза.

это что за диагностика?
вадя

все таблицы связаны по полю id

И? на каждый ид несколько строк, как они связаны между собой?
вадя

данные могут иметь и такой вид

drop table t1  
drop table t2  
drop table t3  

create table t1  (id int,n int,s1 nvarchar(10))
create table t2  (id int,n int,s1 nvarchar(10))
create table t3  (id int,n int,s1 nvarchar(10))

INSERT INTO t1 (id,n,s1) VALUES (79,1,'str1')  INSERT INTO t2 (id,n,s1) VALUES (79,1,'xxx1') INSERT INTO t3 (id,n,s1) VALUES (79,1,'eee1')
INSERT INTO t1 (id,n,s1) VALUES (79,2,'str2')  INSERT INTO t2 (id,n,s1) VALUES (79,2,'ddd1') INSERT INTO t3 (id,n,s1) VALUES (79,2,'sss1')
INSERT INTO t1 (id,n,s1) VALUES (79,3,'str3')                                                INSERT INTO t3 (id,n,s1) VALUES (79,3,'fgdf')
INSERT INTO t1 (id,n,s1) VALUES (79,4,'str4')
INSERT INTO t1 (id,n,s1) VALUES (79,5,'str5')                                            


INSERT INTO t1 (id,n,s1) VALUES (80,1,'str1')  INSERT INTO t2 (id,n,s1) VALUES (80,1,'xxx2') INSERT INTO t3 (id,n,s1) VALUES (80,1,'ttt1')
INSERT INTO t1 (id,n,s1) VALUES (80,2,'str2')  INSERT INTO t2 (id,n,s1) VALUES (80,2,'ddd2') 
INSERT INTO t1 (id,n,s1) VALUES (80,3,'str3')                                             
INSERT INTO t1 (id,n,s1) VALUES (80,4,'str4')


INSERT INTO t1 (id,n,s1) VALUES (81,2,'str1')  INSERT INTO t2 (id,n,s1) VALUES (81,1,'xxx3')
                                               INSERT INTO t2 (id,n,s1) VALUES (81,2,'ddd3') 

И что в этом случае надо выводить?
5 дек 09, 20:48    [8024542]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17722

вроде подходит. как вариант .
если возможно проще с новыми данными - будет лучше.
т.к. это селекты то t1,t2,t3 возможно сделаить и с другими доп полями , что б результирующий был проще
есть предложения?
5 дек 09, 20:51    [8024550]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
вадя,

select coalesce(t1.id, t2.id, t3.id), t1.s1, t2.s1, t3.s1 from
t1 full join t2
		on t1.id = t2.id and t1.N = t2.N
full join  t3
		on t1.id = t3.id and t1.N = t3.N
		   or t2.id = t3.id and t2.N = t3.N
5 дек 09, 20:53    [8024553]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17722
выводить можно всё что потребуется
отображено на форме будет несколько столбцов (это в акцессе)
ё предложил работающий вариант, но несколько громоздкий.

поле id это то по чему надо собраить информацию
5 дек 09, 20:55    [8024556]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17722
2iljy
да это более подходит
только надо проверить с реальными данными
спасибо
5 дек 09, 20:58    [8024563]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить