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

Откуда:
Сообщений: 27
Выборка из двух связанных таблиц

Есть две между собой связанные таблицы tabl1 и tabl2

Связаны по ID и ID_tabl1

tabl1
ID NAME
1 text1
2 text2
3 text3

tabl2
ID ID_tabl1 RES
1 1 5
2 2 7
3 3 10
4 3 12
5 2 9
6 2 4


Нужно чтобы в общую таблицу выводило результаты с максимальным значением поля ID в tabl2

ID NAME ID ID_tabl1 RES
1 text1 1 1 5
2 text2 6 2 4
3 text3 4 2 12


P.S. может я не правильно объяснил...
16 июн 15, 15:59    [17777351]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
andrey82y,

так?
SELECT DISTINCT * FROM 
(
SELECT  tabl1.ID, tabl1.NAME, 
FIRST_VALUE(t2.id) OVER (PARTITION BY tabl1.ID ORDER BY tabl2.ID DESC), 
FIRST_VALUE(t2.RES) OVER (PARTITION BY tabl1.ID ORDER BY tabl2.ID DESC)
FROM tabl1
LEFT JOIN tabl2 ON tabl1.ID = tabl2.ID_tabl1 
) X
16 июн 15, 16:11    [17777432]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
o-o
Guest
declare @tabl1 table(ID int, NAME varchar(100));
insert into @tabl1 values
(1, 'text1'),
(2, 'text2'),
(3, 'text3')

declare @tabl2 table(ID int, ID_tabl1 int, RES int);
insert into @tabl2 values
(1, 1, 5),
(2, 2, 7),
(3, 3, 10),
(4, 3, 12),
(5, 2, 9),
(6, 2, 4)

select *
from @tabl1 t1 outer apply ( select top 1 * 
                             from @tabl2 t2  
                             where t1.ID = t2.ID_tabl1
                             order by id desc) a;
-------------
ID	NAME	ID	ID_tabl1	RES
1	text1	1	1	5
2	text2	6	2	4
3	text3	4	3	12
16 июн 15, 16:32    [17777564]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
andrey82y
Member

Откуда:
Сообщений: 27
a_voronin
andrey82y,

так?
SELECT DISTINCT * FROM 
(
SELECT  tabl1.ID, tabl1.NAME, 
FIRST_VALUE(t2.id) OVER (PARTITION BY tabl1.ID ORDER BY tabl2.ID DESC), 
FIRST_VALUE(t2.RES) OVER (PARTITION BY tabl1.ID ORDER BY tabl2.ID DESC)
FROM tabl1
LEFT JOIN tabl2 ON tabl1.ID = tabl2.ID_tabl1 
) X


ругается на синтаксис "X"
16 июн 15, 16:32    [17777565]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
andrey82y
Member

Откуда:
Сообщений: 27
o-o,


Спасибо! Работает!
16 июн 15, 16:38    [17777602]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
Добрый Э - Эх
Guest
andrey82y,

ещё несколько способов
16 июн 15, 16:38    [17777603]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
andrey82y
Member

Откуда:
Сообщений: 27
o-o
declare @tabl1 table(ID int, NAME varchar(100));
insert into @tabl1 values
(1, 'text1'),
(2, 'text2'),
(3, 'text3')

declare @tabl2 table(ID int, ID_tabl1 int, RES int);
insert into @tabl2 values
(1, 1, 5),
(2, 2, 7),
(3, 3, 10),
(4, 3, 12),
(5, 2, 9),
(6, 2, 4)

select *
from @tabl1 t1 outer apply ( select top 1 * 
                             from @tabl2 t2  
                             where t1.ID = t2.ID_tabl1
                             order by id desc) a;
-------------
ID	NAME	ID	ID_tabl1	RES
1	text1	1	1	5
2	text2	6	2	4
3	text3	4	3	12


Есть вопрос.

Когда выполняю запрос в таком виде

select  ID, NAME
from tabl1 t1 outer apply ( select top 1 * 
                             from tabl2 t2  
                             where t1.ID = t2.ID_tabl1
                             order by id desc) a;


не показывается столбцы tabl2
17 июн 15, 08:33    [17779964]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
Добрый Э - Эх
Guest
andrey82y
Есть вопрос.

Когда выполняю запрос в таком виде

select  ID, NAME
from tabl1 t1 outer apply ( select top 1 * 
                             from tabl2 t2  
                             where t1.ID = t2.ID_tabl1
                             order by id desc) a;


не показывается столбцы tabl2
Есть ответ - а должно? И если должно, то каком образом? Ты же в селект листе не просишь выводить поля из присоединенного боком подзапроса по таблице tabl2...
17 июн 15, 08:39    [17779978]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
andrey82y
Member

Откуда:
Сообщений: 27
Добрый Э - Эх
andrey82y
Есть вопрос.

Когда выполняю запрос в таком виде

select  ID, NAME
from tabl1 t1 outer apply ( select top 1 * 
                             from tabl2 t2  
                             where t1.ID = t2.ID_tabl1
                             order by id desc) a;


не показывается столбцы tabl2
Есть ответ - а должно? И если должно, то каком образом? Ты же в селект листе не просишь выводить поля из присоединенного боком подзапроса по таблице tabl2...


А можешь показать? Как вывести определенные поля в этом запросе.
17 июн 15, 08:44    [17779991]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
o-o
Guest
У второй таблицы алиас "а".
Select a.Id, a.res...
17 июн 15, 08:57    [17780017]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
andrey82y
Member

Откуда:
Сообщений: 27
o-o
У второй таблицы алиас "а".
Select a.Id, a.res...

А как это изобразить в запросе?
17 июн 15, 09:02    [17780027]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
xenix
Guest
Да так и изобразить
select  ID, NAME,a.*
from tabl1 t1 outer apply ( select top 1 * 
                             from tabl2 t2  
                             where t1.ID = t2.ID_tabl1
                             order by id desc) a;
17 июн 15, 09:06    [17780038]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
andrey82y
Member

Откуда:
Сообщений: 27
Спасибо! Все получилось!
17 июн 15, 09:08    [17780045]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
Стало интересно
Guest
andrey82y
Когда выполняю запрос в таком виде

select  ID, NAME
from tabl1 t1 outer apply ( select top 1 * 
                             from tabl2 t2  
                             where t1.ID = t2.ID_tabl1
                             order by id desc) a;


не показывается столбцы tabl2
Запрос выполняется? И даже не падает с ошибкой: Ambiguous column name 'ID'?
17 июн 15, 09:11    [17780055]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
o-o
Guest
Стало интересно,

у ТС сервер особенный, персонализированный.
тот же воронинский запрос 17777432
+
declare @tabl1 table(ID int, NAME varchar(100));
insert into @tabl1 values
(1, 'text1'),
(2, 'text2'),
(3, 'text3');

declare @tabl2 table(ID int, ID_tabl1 int, RES int);
insert into @tabl2 values
(1, 1, 5),
(2, 2, 7),
(3, 3, 10),
(4, 3, 12),
(5, 2, 9),
(6, 2, 4);

SELECT DISTINCT * FROM 
(
SELECT  tabl1.ID, tabl1.NAME, 
FIRST_VALUE(t2.id) OVER (PARTITION BY tabl1.ID ORDER BY tabl2.ID DESC), 
FIRST_VALUE(t2.RES) OVER (PARTITION BY tabl1.ID ORDER BY tabl2.ID DESC)
FROM @tabl1 tabl1
LEFT JOIN @tabl2 tabl2 ON tabl1.ID = tabl2.ID_tabl1 
) X


должен выдавать следующие(легко исправляемые) ошибки:

Msg 4104, Level 16, State 1, Line 20
The multi-part identifier "t2.id" could not be bound.
Msg 4104, Level 16, State 1, Line 21
The multi-part identifier "t2.RES" could not be bound.
Msg 8155, Level 16, State 2, Line 24
No column name was specified for column 3 of 'X'.
Msg 8155, Level 16, State 2, Line 24
No column name was specified for column 4 of 'X'.


но у ТС
andrey82y
a_voronin
andrey82y,

так?
SELECT DISTINCT * FROM 
(
SELECT  tabl1.ID, tabl1.NAME, 
FIRST_VALUE(t2.id) OVER (PARTITION BY tabl1.ID ORDER BY tabl2.ID DESC), 
FIRST_VALUE(t2.RES) OVER (PARTITION BY tabl1.ID ORDER BY tabl2.ID DESC)
FROM tabl1
LEFT JOIN tabl2 ON tabl1.ID = tabl2.ID_tabl1 
) X


ругается на синтаксис "X"

17 июн 15, 09:57    [17780225]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
o-o,

у нас отругался бы на FIRST_VALUE !

Откуда уверенность, что сервер 2012-й?
17 июн 15, 10:00    [17780239]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из двух связанных таблиц  [new]
o-o
Guest
iap,
>= 2012
а уверенность именно оттуда, что дело дошло до упоминания Х
17 июн 15, 10:03    [17780259]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить