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

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

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

и что у вас "не возможно" допустим для динамического запроса?
...
Рейтинг: 0 / 0
Забавный запрос
    #39618375
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968Может подскажите решение?Секционированное представление из Table10,Table20, Table30 и т.д. Тогда сможете осуществить желаемое на чистом TSQL
Или пишите функцию SQLCLR, которая будет внутри заниматься непотребством по разгребанию перечня таблиц, запроса к каждой и формированием результата.
...
Рейтинг: 0 / 0
Забавный запрос
    #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
Забавный запрос
    #39618395
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да первым делом, на ум приходит следующее, написать функцию с динамическим запросом, но EXEC(...) вроде ничего не возвращает, а exec sp_executesql в функциях применять нельзя
...
Рейтинг: 0 / 0
Забавный запрос
    #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
Забавный запрос
    #39618739
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmpatrick1968Может подскажите решение?Секционированное представление из Table10,Table20, Table30 и т.д. Тогда сможете осуществить желаемое на чистом TSQL+1
Тогда при изменении набора таблиц достаточно будет просто поменять view, причём это можно делать даже программно, там, где добавляются/удаляются эти таблицы.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Забавный запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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