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

Откуда:
Сообщений: 36
Доброго всем времени суток.
Есть несколько однотипных запросов вида
SELECT t1.name, COUNT(*)
FROM table_1 AS t1
JOIN table_2 AS t2 ON t2.t1_id = t1.t1_id
JOIN table_3 AS t3 ON t3.t1_id = t2.t1_id
WHERE t1.param1 = 1 AND t2.param2 = 2 AND t3.param3 = 3

в БД организация такая что информация пишется в разные таблицы table_2, но они все имеют общие таблицы table_1 и table_3.
Т.е. информация по второму источнику будет выбираться запросом:
SELECT t1.name, COUNT(*)
FROM table_1 AS t1
JOIN table_4 AS t4 ON t4.t1_id = t1.t1_id
JOIN table_3 AS t3 ON t3.t3_id = t4.t4_id
WHERE t1.param1 = 1 AND [b]t4.param4 = 4[/b] AND t3.param3 = 3

Меняется вторая присоединенная таблица, поле по которой она объединяется с первой остается всегда одно и тоже. Наименование полей t4.t4_id и t2.t1_id одинаковые. Меняется так же условие выборки t2.param2 = 2 и t4.param4 = 4, условия по первой и третьей таблицах остаются одинаковыми.

Как бы написать запрос так, что бы не надо было писать кучу однотипных запросов меняя только вторую таблицу и условия по ней?
11 ноя 13, 12:33    [15108038]     Ответить | Цитировать Сообщить модератору
 Re: Однотипные запросы из нескольких таблиц  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SilverVolg
Как бы написать запрос так, что бы не надо было писать кучу однотипных запросов меняя только вторую таблицу и условия по ней?

Чтобы не менять условия — напишите параметризованный запрос. Или используйте переменные T-SQL. Зависит от того, где именно у вас "есть несколько однотипных запросов".

Насчёт замены таблицы — а сколько у вас их там, этих таблиц?
11 ноя 13, 12:58    [15108232]     Ответить | Цитировать Сообщить модератору
 Re: Однотипные запросы из нескольких таблиц  [new]
SilverVolg
Member

Откуда:
Сообщений: 36
Гость333
SilverVolg
Как бы написать запрос так, что бы не надо было писать кучу однотипных запросов меняя только вторую таблицу и условия по ней?

Чтобы не менять условия — напишите параметризованный запрос. Или используйте переменные T-SQL. Зависит от того, где именно у вас "есть несколько однотипных запросов".

Насчёт замены таблицы — а сколько у вас их там, этих таблиц?

9 таблиц
и получается что то вида:
SELECT t1.name, COUNT(*)
FROM table_1 AS t1
JOIN table_2 AS t2 ON t2.t1_id = t1.t1_id
JOIN table_3 AS t3 ON t3.t1_id = t2.t1_id
WHERE t1.param1 = 1 AND t2.param2 = 2 AND t3.param3 = 3
UNION
SELECT t1.name, COUNT(*)
FROM table_1 AS t1
JOIN table_4 AS t4 ON t4.t1_id = t1.t1_id
JOIN table_3 AS t3 ON t3.t3_id = t4.t4_id
WHERE t1.param1 = 1 AND t4.param4 = 4 AND t3.param3 = 3
UNION ...

и так copy-paste 9 раз с заменой таблиц и условий
11 ноя 13, 13:01    [15108261]     Ответить | Цитировать Сообщить модератору
 Re: Однотипные запросы из нескольких таблиц  [new]
Гость333
Member

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

Возможно, секционированное представление вам поможет.
11 ноя 13, 13:04    [15108286]     Ответить | Цитировать Сообщить модератору
 Re: Однотипные запросы из нескольких таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
SELECT t1.name, COUNT(*)
FROM table_1 AS t1
JOIN ( 
select * from table_2 AS t2 WHERE t2.param2 = 2
UNION
select * from table_4 AS t4 WHERE t4.param4 = 4
UNION ...
) as tablex
JOIN table_3 AS t3 ON t3.t1_id = tX.t1_id
WHERE t1.param1 = 1 AND t3.param3 = 3
11 ноя 13, 13:07    [15108323]     Ответить | Цитировать Сообщить модератору
 Re: Однотипные запросы из нескольких таблиц  [new]
SilverVolg
Member

Откуда:
Сообщений: 36
Glory
SELECT t1.name, COUNT(*)
FROM table_1 AS t1
JOIN ( 
select * from table_2 AS t2 WHERE t2.param2 = 2
UNION
select * from table_4 AS t4 WHERE t4.param4 = 4
UNION ...
) as tablex
JOIN table_3 AS t3 ON t3.t1_id = tX.t1_id
WHERE t1.param1 = 1 AND t3.param3 = 3

Жестко, потому что основное ограничение выборки идет по t1.param1 = 1, и получается что подзапрос
select * from table_2 AS t2 WHERE t2.param2 = 2
UNION
select * from table_4 AS t4 WHERE t4.param4 = 4

будет выгребать много лишнего.
ну во всяком случаем мне так показалось из-за скорости работы такой конструкции, и причем объединил только 2 таблицы таким образом. Посмотреть план запроса нет возможности - правей не дают на это.
11 ноя 13, 13:19    [15108431]     Ответить | Цитировать Сообщить модератору
 Re: Однотипные запросы из нескольких таблиц  [new]
Jaffar
Member

Откуда:
Сообщений: 633
сделайте для каждой "второй" таблицы вид и все "общие" общие условия внесите в него.
11 ноя 13, 13:22    [15108460]     Ответить | Цитировать Сообщить модератору
 Re: Однотипные запросы из нескольких таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
SilverVolg
будет выгребать много лишнего.

А сейчас он "мало выгребает" ?
11 ноя 13, 13:22    [15108462]     Ответить | Цитировать Сообщить модератору
 Re: Однотипные запросы из нескольких таблиц  [new]
SilverVolg
Member

Откуда:
Сообщений: 36
Glory
SilverVolg
будет выгребать много лишнего.

А сейчас он "мало выгребает" ?

Да, ограничивается из-за первого условия.
11 ноя 13, 13:27    [15108523]     Ответить | Цитировать Сообщить модератору
 Re: Однотипные запросы из нескольких таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
SilverVolg
Да, ограничивается из-за первого условия.

Какого 1го ?
Если вы не видели плана выполнения, то откуда знаете порядок выполнения соединений и условий ?
11 ноя 13, 13:28    [15108540]     Ответить | Цитировать Сообщить модератору
 Re: Однотипные запросы из нескольких таблиц  [new]
SilverVolg
Member

Откуда:
Сообщений: 36
Jaffar
сделайте для каждой "второй" таблицы вид и все "общие" общие условия внесите в него.

не понял, можно подробнее.
11 ноя 13, 13:30    [15108554]     Ответить | Цитировать Сообщить модератору
 Re: Однотипные запросы из нескольких таблиц  [new]
inline TVF?
Guest
SilverVolg
Jaffar
сделайте для каждой "второй" таблицы вид и все "общие" общие условия внесите в него.

не понял, можно подробнее.


может, имелась в виду inline table-valued function?
таблицы-то можно туда загнать, а про условия не подскажу

create table dbo.company1(
	id_comp int not null,
	name varchar(50)); 
	
create table dbo.company2(
	id_comp int not null,
	name varchar(50)); 
	
create function dbo.company_ (@num int)
returns table
as
return 
(
    select ID_comp, name
    from dbo.Company1
    where 1 = @num
    
    union all
    
    select ID_comp, name
    from dbo.Company2
    where 2 = @num    
);
11 ноя 13, 14:08    [15108904]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить