Есть ли способ динамического объединения между таблицами? - PullRequest
1 голос
/ 29 августа 2011

С учетом схем A и A1 - A100 со следующими схемами:

CREATE Table A(
ID INT NOT NULL,
Value1 VARCHAR(10) NOT NULL,
TableName VARCHAR(4) NOT NULL
)

INSERT INTO A
(1, 'Val1', 'A1'),
(2, 'Val2', 'A5')

CREATE TABLE A1( --and same for tables A2 - A100
ID INT NOT NULL,
Value2 VARCHAR(10) NOT NULL
)

INSERT INTO A1
(1, 'Val74')
INSERT INTO A5
(1, 'Val39')

Как я могу сделать следующее?(псевдокод)

SELECT A.Value1, X.Value2
FROM A INNER JOIN X ON A.TableName = X

И производим:

Value1  Value2
Val1    Val74
Val2    Val39

Ответы [ 3 ]

3 голосов
/ 29 августа 2011

Это прекрасный пример того, как вы можете построить свой запрос, используя динамический SQL. Это даст вам наилучшую возможную производительность с вашей текущей настройкой, и она короткая и легко читаемая.

DECLARE @sql varchar(max)
SELECT @sql = coalesce(@sql + ' UNION ALL ', '')+'SELECT A.Value1, '+tablename+'.Value2 FROM A INNER JOIN '+ tablename + ' ON A.TableName = '''+tablename +''''
FROM A

EXEC(@sql)

Результат:

Value1     Value2
---------- ----------
Val1       Val74
Val2       Val39
3 голосов
/ 29 августа 2011

Вам понадобится динамический SQL для динамического объединения таблиц.

Если у вас есть 100 различных таблиц с одной и той же схемой, вы уверены, что их не следует объединять в одну таблицу с полем "type"?

В любом случае вы можете смоделировать это с видом

CREATE VIEW AView
AS
SELECT 'A1' AS name , ID, Value2
FROM  A1
UNION ALL
SELECT 'A2' AS name , ID, Value2
FROM  A2
UNION ALL ...

Вам необходимо проверить план выполнения и вывод SET STATISTICS IO ON, чтобы убедиться, что ваши запросы не касаются ненужных таблиц. Вам может понадобиться подсказка RECOMPILE.

0 голосов
/ 29 августа 2011

Вы не можете использовать данные в качестве имени таблицы в запросе.Кроме того, то, что вы пытаетесь сделать, не будет объединением, это будет подзапрос, поскольку каждая запись в таблице A может использовать свою таблицу.

Чтобы сделать что-то подобное, вам нужно будет создать запросдинамически, и вам нужен отдельный запрос для каждой записи в таблице A, или, по крайней мере, отдельный запрос для каждого отдельного значения TableName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...