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

Откуда:
Сообщений: 15
Привет комрады, не могу понять как подойти к реализации следующей задачи. Помогите плиз
есть 2 таблицы
1)
nom id
11 1
11 1
11 1
11 1
11 2
13 3
14 4
15 5
15 5
16 6
11 7
11 7
18 8

2)
id naz
1 a
1 a
1 s
1 s
2 s
2 d
3 a
4 f
5 f
6 a
7 d
7 d
7 f
8 f

Надо создать запрос, к 1 таблици подцепить колонку naz из 2. По приоритетам, что бы она схлопнулась
Уровень приоритетов. Ниже не id, а номера приоритетов соответственно от высокого к нижнему
1 s
2 a
3 d
4 f

должно получиться следующее
nom id naz
11 1 s
11 2 s
13 3 a
14 4 f
15 5 f
16 6 a
11 7 d
18 8 f
17 ноя 13, 07:28    [15142956]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28147
Блин, когда-ж вы уже научитесь вопросы оформлять?

BEGIN TRAN

CREATE TABLE #t1 (nom int, ID INT);
GO
CREATE TABLE #t2 (ID INT, naz char(1));
GO
CREATE TABLE #t3 (ID INT, naz char(1));
GO
INSERT INTO #t1(nom, ID) VALUES
(11, 1),
(11, 1),
(11, 1),
(11, 1),
(11, 2),
(13, 3),
(14, 4),
(15, 5),
(15, 5),
(16, 6),
(11, 7),
(11, 7),
(18, 8)
GO
INSERT INTO #t2(ID, naz) VALUES
(1, 'a'),
(1, 'a'),
(1, 's'),
(1, 's'),
(2, 's'),
(2, 'd'),
(3, 'a'),
(4, 'f'),
(5, 'f'),
(6, 'a'),
(7, 'd'),
(7, 'd'),
(7, 'f'),
(8, 'f')
GO
INSERT INTO #t3(ID, naz) VALUES
(1, 's'),
(2, 'a'),
(3, 'd'),
(4, 'f') 
GO
;WITH PreSelect AS (
  SELECT t2.ID, MIN(t3.ID) as Ref
  FROM #t2 as t2 INNER JOIN #t3 as t3 ON t2.naz = t3.naz
  GROUP BY t2.ID
)
SELECT DISTINCT t1.nom, p.ID, tt3.naz
FROM #t1 as t1 
INNER JOIN PreSelect as p on t1.ID = p.ID
INNER JOIN #t3 as tt3 on tt3.ID = p.Ref

GO
DROP TABLE #t1
GO
DROP TABLE #t2
GO
DROP TABLE #t3

ROLLBACK

Может и красивее можно, но это первое что пришло в голову.
17 ноя 13, 08:04    [15142986]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
select a.nom, a.id, b.naz
from (
  select distinct nom,id
  from table1
  ) a
join(
  select id, max(naz) naz
  from table2
  group bu id
  ) b on b.id=a.id
17 ноя 13, 08:19    [15142998]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Конечно, не GROUP BU, а GROUP BY,
а во-вторых, почему
Airgolem
должно получиться следующее
nomid naz
11 7 d
17 ноя 13, 08:25    [15143006]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
А, недочитал, сорь.

Тогда 15142986
17 ноя 13, 08:28    [15143009]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
SandalTree
Блин, когда-ж вы уже научитесь вопросы оформлять?
А зачем себя утруждать, если и так за тебя всё сделают?
17 ноя 13, 09:23    [15143027]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
Airgolem
Member

Откуда:
Сообщений: 15
Ruuu
SandalTree
Блин, когда-ж вы уже научитесь вопросы оформлять?
А зачем себя утруждать, если и так за тебя всё сделают?


Извините. Было бы не плохо сказать, что именно не так оформлено. Дабы не повторялось такое. Вопрос вроде четко сформулировал
17 ноя 13, 13:01    [15143280]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Airgolem

Извините. Было бы не плохо сказать, что именно не так оформлено. Дабы не повторялось такое. Вопрос вроде четко сформулировал


Учу читать,дорого
17 ноя 13, 13:05    [15143289]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
Airgolem
Member

Откуда:
Сообщений: 15
Ken@t,
Спасибки, сейчас прочту=)

Cygapb-007, спасибо большое, еще не разобрался как использовать with=)
17 ноя 13, 13:22    [15143332]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
sdet
Member

Откуда:
Сообщений: 463
Airgolem,
select nom,id,naz
from
(select distinct t1.nom nom,t2.id id,t3.naz naz,t3.id pr,dense_rank() over(partition by t1.nom,t2.id order by t3.id) rnk
from #t2 t2 join #t3 t3 on t2.naz=t3.naz
join #t1 t1 on t1.id=t2.id) t
where rnk=1
17 ноя 13, 17:03    [15144020]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28147
sdet
Airgolem,
select nom,id,naz
from
(select distinct t1.nom nom,t2.id id,t3.naz naz,t3.id pr,dense_rank() over(partition by t1.nom,t2.id order by t3.id) rnk
from #t2 t2 join #t3 t3 on t2.naz=t3.naz
join #t1 t1 on t1.id=t2.id) t
where rnk=1
Если ему для лабы, то он такое не сдаст
17 ноя 13, 19:55    [15144509]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
Jaffar
Member

Откуда:
Сообщений: 636
SandalTree,



select t1.nom, t1.ID, t2.naz
from Table_1 t1
cross apply(select top 1 t2.*
            from Table_2 t2
            where
                    t2.ID = t1.ID 
            order by 
            case t2.naz when 's' then 1 when 'a' then 2 when 'd' then 3 when 'f' then 4 end asc /**/ ) t2
18 ноя 13, 08:12    [15146046]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
sdet
Member

Откуда:
Сообщений: 463
Jaffar,

Хардкодный вариант никогда не был хорошим вариантом. Вы теперь все новые значения в таблице каждый раз в коде будете прописывать?
18 ноя 13, 11:22    [15146819]     Ответить | Цитировать Сообщить модератору
 Re: Как?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28147
sdet
Jaffar,

Хардкодный вариант никогда не был хорошим вариантом. Вы теперь все новые значения в таблице каждый раз в коде будете прописывать?
Зато получит законный трояк
21 ноя 13, 01:48    [15165622]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить