Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Забавный запрос / 12 сообщений из 12, страница 1 из 1
21.03.2018, 15:57
    #39618338
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
Существует у нас БД и меня попросили организовать запрос, на первый взгляд всё тривиально - НО
опишу фрагмент: есть главная таблица, такая Table1 (id int, idu int, alias nvarchar(15)) и есть некоторое количество таблиц (Table10,Table20, Table30 и т.д) в каждой из которых есть обязательно поля (id int) и (Code int), а надо эти таблицы сджойнить по полю Тавle1.idu и id в других таблицах, а вот в каких указывается в поле alias, я пытался через скалярную функцию с параметрами в которой выполнять запрос, формирующийся динамически EXEC(...), но он ничего вернуть не может, через временную таблицу, также выяснилось, что в функциях их нельзя использовать, можно конечно расписать "в лоб" все варианты, но количество таблиц для связки может меняться, ну и хотелось сделать красивее. Может подскажите решение? Заранее благодарен.
...
Рейтинг: 0 / 0
21.03.2018, 15:59
    #39618342
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
Что говорят архитекторы этой БД?
...
Рейтинг: 0 / 0
21.03.2018, 16:06
    #39618348
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
Ну, это уже другой вопрос
...
Рейтинг: 0 / 0
21.03.2018, 16:10
    #39618353
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
patrick1968,

Ничерта не понятно что надо, а что у вас "нельзя" ещё более неясно
...
Рейтинг: 0 / 0
21.03.2018, 16:23
    #39618364
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
patrick1968,

вы пишете о решении. не предоставив бизнес-задачи. В этом случае любое решение неверно, так как его нет возможности проверить.
...
Рейтинг: 0 / 0
21.03.2018, 16:27
    #39618371
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
Главная таблица (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
...
Рейтинг: 0 / 0
21.03.2018, 16:29
    #39618373
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
patrick1968,

и что у вас "не возможно" допустим для динамического запроса?
...
Рейтинг: 0 / 0
21.03.2018, 16:34
    #39618375
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
patrick1968Может подскажите решение?Секционированное представление из Table10,Table20, Table30 и т.д. Тогда сможете осуществить желаемое на чистом TSQL
Или пишите функцию SQLCLR, которая будет внутри заниматься непотребством по разгребанию перечня таблиц, запроса к каждой и формированием результата.
...
Рейтинг: 0 / 0
21.03.2018, 16:38
    #39618379
0wl
0wl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
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'
...
...
Рейтинг: 0 / 0
21.03.2018, 17:04
    #39618395
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
Ну да первым делом, на ум приходит следующее, написать функцию с динамическим запросом, но EXEC(...) вроде ничего не возвращает, а exec sp_executesql в функциях применять нельзя
...
Рейтинг: 0 / 0
21.03.2018, 17:14
    #39618406
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
patrick1968,
Пример для изучения и анализа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
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

...
Рейтинг: 0 / 0
22.03.2018, 11:07
    #39618739
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Забавный запрос
invmpatrick1968Может подскажите решение?Секционированное представление из Table10,Table20, Table30 и т.д. Тогда сможете осуществить желаемое на чистом TSQL+1
Тогда при изменении набора таблиц достаточно будет просто поменять view, причём это можно делать даже программно, там, где добавляются/удаляются эти таблицы.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Забавный запрос / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]