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

Откуда:
Сообщений: 451
Существует у нас БД и меня попросили организовать запрос, на первый взгляд всё тривиально - НО
опишу фрагмент: есть главная таблица, такая Table1 (id int, idu int, alias nvarchar(15)) и есть некоторое количество таблиц (Table10,Table20, Table30 и т.д) в каждой из которых есть обязательно поля (id int) и (Code int), а надо эти таблицы сджойнить по полю Тавle1.idu и id в других таблицах, а вот в каких указывается в поле alias, я пытался через скалярную функцию с параметрами в которой выполнять запрос, формирующийся динамически EXEC(...), но он ничего вернуть не может, через временную таблицу, также выяснилось, что в функциях их нельзя использовать, можно конечно расписать "в лоб" все варианты, но количество таблиц для связки может меняться, ну и хотелось сделать красивее. Может подскажите решение? Заранее благодарен.
21 мар 18, 15:57    [21274993]     Ответить | Цитировать Сообщить модератору
 Re: Забавный запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36979
Что говорят архитекторы этой БД?
21 мар 18, 15:59    [21275002]     Ответить | Цитировать Сообщить модератору
 Re: Забавный запрос  [new]
patrick1968
Member

Откуда:
Сообщений: 451
Ну, это уже другой вопрос
21 мар 18, 16:06    [21275026]     Ответить | Цитировать Сообщить модератору
 Re: Забавный запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
patrick1968,

Ничерта не понятно что надо, а что у вас "нельзя" ещё более неясно
21 мар 18, 16:10    [21275042]     Ответить | Цитировать Сообщить модератору
 Re: Забавный запрос  [new]
Владислав Колосов
Member

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

вы пишете о решении. не предоставив бизнес-задачи. В этом случае любое решение неверно, так как его нет возможности проверить.
21 мар 18, 16:23    [21275075]     Ответить | Цитировать Сообщить модератору
 Re: Забавный запрос  [new]
patrick1968
Member

Откуда:
Сообщений: 451
Главная таблица (table1)
id idu alias
-------------------------
1 1 table10
1 2 table10
1 1 table20
....
1 9 table50


Таблица table10
id Code
-----------------
1 111
2 222

Таблица table20
id Code
-----------------
1 11111
2 22222

Надо получить из таблицы 1 и привязать к нему Code
id idu alias
-------------------------
1 1 table10
1 2 table10
1 1 table20
....
1 9 table50
21 мар 18, 16:27    [21275094]     Ответить | Цитировать Сообщить модератору
 Re: Забавный запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
patrick1968,

и что у вас "не возможно" допустим для динамического запроса?
21 мар 18, 16:29    [21275096]     Ответить | Цитировать Сообщить модератору
 Re: Забавный запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
patrick1968
Может подскажите решение?
Секционированное представление из Table10,Table20, Table30 и т.д. Тогда сможете осуществить желаемое на чистом TSQL
Или пишите функцию SQLCLR, которая будет внутри заниматься непотребством по разгребанию перечня таблиц, запроса к каждой и формированием результата.
21 мар 18, 16:34    [21275110]     Ответить | Цитировать Сообщить модератору
 Re: Забавный запрос  [new]
0wl
Member

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

В 1С похожим образом сделана работа с полями составного типа: в одной колонке ид (RRref), в соседней -- указание принадлежности этого ид (TRef). Ну и вариантов особо нет: просто джойнить все возможные таблицы "лесенкой":


SELECT *
FROM T1
LEFT JOIN T20
ON t1.id = t20.id AND t.alias = 'T20'
LEFT JOIN T30
ON t1.id = t30.id AND t.alias = 'T30'
...
21 мар 18, 16:38    [21275119]     Ответить | Цитировать Сообщить модератору
 Re: Забавный запрос  [new]
patrick1968
Member

Откуда:
Сообщений: 451
Ну да первым делом, на ум приходит следующее, написать функцию с динамическим запросом, но EXEC(...) вроде ничего не возвращает, а exec sp_executesql в функциях применять нельзя
21 мар 18, 17:04    [21275195]     Ответить | Цитировать Сообщить модератору
 Re: Забавный запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
patrick1968,
+ Пример для изучения и анализа
use tempdb;
go

create table dbo.t1 (id int primary key, external_id int, some_data int);
create table dbo.t2 (id int primary key, external_id int, some_data int);
create table dbo.t3 (id int primary key, external_id int, some_data int);

create table dbo.t (id int primary key, external_id int, tables_list nvarchar(max));
go

insert into dbo.t1
values
 (1, 1, 1), (2, 1, 1), (3, 2, 2);

insert into dbo.t2
values
 (1, 1, 10), (2, 1, 10), (3, 2, 20);

insert into dbo.t3
values
 (1, 1, 100), (2, 1, 100), (3, 2, 200);

insert into dbo.t
values
 (1, 1, 't1, t2'), (2, 2, 't2, t3');
go

create function dbo.fnGetDataFromTable
(
 @external_id int,
 @table_name sysname
)
returns table
as
return (
 select id, some_data from dbo.t1 where @table_name = 't1' and external_id = @external_id
 union all
 select id, some_data from dbo.t2 where @table_name = 't2' and external_id = @external_id
 union all
 select id, some_data from dbo.t3 where @table_name = 't3' and external_id = @external_id
);
go

set statistics xml on;

select
 t.id, t.external_id, t.tables_list, c.table_name, d.*
from
 dbo.t cross apply
 (select cast('<item t = "' + replace(t.tables_list, ', ', '" /><item t = "') + '" />' as xml)) a(x) cross apply
 a.x.nodes('item') b(n) cross apply
 (select ltrim(rtrim(b.n.value('@t', 'sysname')))) c(table_name) cross apply
 dbo.fnGetDataFromTable(t.external_id, c.table_name) d;

 set statistics xml off;
 go

drop function dbo.fnGetDataFromTable;
drop table dbo.t, dbo.t1, dbo.t2, dbo.t3;
go
21 мар 18, 17:14    [21275237]     Ответить | Цитировать Сообщить модератору
 Re: Забавный запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31357
invm
patrick1968
Может подскажите решение?
Секционированное представление из Table10,Table20, Table30 и т.д. Тогда сможете осуществить желаемое на чистом TSQL
+1
Тогда при изменении набора таблиц достаточно будет просто поменять view, причём это можно делать даже программно, там, где добавляются/удаляются эти таблицы.
22 мар 18, 11:07    [21276511]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить