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

Откуда:
Сообщений: 25
Прошу подсказки по запросу.

Модельная ситуация: есть таблица FACTS, в которой хранится категория и ID партнера, а также две отдельные таблицы партнеров (Покупателей и Продавцов), ID покупателей и продавцов могут совпадать. В отдельной таблице (SQLStructure) хранится соответствие категорий партнеров и имен таблиц, в которых хранятся партнеры этой категории.
Необходимо получить соединение таблиы FACTS с данными из таблиц партнеров.

Таблица FACTS
PartnerCategoryPartnerID
Buyer1
Buyer2
Seller1
Seller2


Таблица TableBuyers
PartnerIDPartnerName
1Buyer1 Data
2Buyer2 Data


Таблица TableSellers
PartnerIDPartnerName
1Seller1 Data
2Seller2 Data


Таблица SQLStructure
LogicalNameTableName
SellerTableSellers
BuyerTableBuyers


Из этих данных хочется получить вот что:
PartnerCategoryPartnerIDPartnerName
Buyer1Buyer1 Data
Buyer2Buyer2 Data
Seller1Seller1 Data
Seller2Seller2 Data


Получить имя нужной таблицы очень легко обычным left join с таблицей SQLStructure, однако как в том же запросе выполнить поиск по ID именно в той таблице, имя которой будет получено?

Обходить курсором нежелательно - объем большой. Сделать жесткий join по всем таблицам одновременно и по ID и по категории не получится, т.к. в реальной ситуации связанных таблиц не 2, а гораздо больше и их имена могут меняться, например в другом экземпляре базы таблица TableSellers может называться SellersData.

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

Скрипт для создания и заполнения модельки:
--IF OBJECT_ID('FACTS')IS NOT NULL DROP TABLE FACTS
CREATE TABLE [dbo].[FACTS] (
	[PartnerCategory] [varchar] (20) NOT NULL ,
	[PartnerID] [int] NOT NULL 
) ON [PRIMARY]
GO
--IF OBJECT_ID('SQLStructure')IS NOT NULL DROP TABLE SQLStructure
CREATE TABLE [dbo].[SQLStructure] (
	[LogicalName] [varchar] (20) NOT NULL ,
	[TableName] [varchar] (20) NOT NULL
) ON [PRIMARY]
GO
--IF OBJECT_ID('TableSellers')IS NOT NULL DROP TABLE TableSellers
CREATE TABLE [dbo].[TableSellers] (
	[PartnerID] [int] NOT NULL ,
	[PartnerName] [varchar] (20) NOT NULL 
) ON [PRIMARY]
GO
--IF OBJECT_ID('TableBuyers')IS NOT NULL DROP TABLE TableBuyers
CREATE TABLE [dbo].[TableBuyers] (
	[PartnerID] [int] NOT NULL ,
	[PartnerName] [varchar] (20) NOT NULL 
) ON [PRIMARY]
GO

INSERT INTO SQLStructure (LogicalName,TableName) values ('Seller','TableSellers')
INSERT INTO SQLStructure (LogicalName,TableName) values ('Buyer','TableBuyers')

INSERT INTO TableSellers (PartnerID,PartnerName) values (1,'Seller1 Data')
INSERT INTO TableSellers (PartnerID,PartnerName) values (2,'Seller2 Data')

INSERT INTO TableBuyers (PartnerID,PartnerName) values (1,'Buyer1 Data')
INSERT INTO TableBuyers (PartnerID,PartnerName) values (2,'Buyer2 Data')

INSERT INTO FACTS (PartnerCategory,PartnerID) values ('Buyer',1)
INSERT INTO FACTS (PartnerCategory,PartnerID) values ('Buyer',2)
INSERT INTO FACTS (PartnerCategory,PartnerID) values ('Seller',1)
INSERT INTO FACTS (PartnerCategory,PartnerID) values ('Seller',2)

Спасибо
17 июл 09, 19:17    [7431312]     Ответить | Цитировать Сообщить модератору
 Re: join в запросе с таблицами, имена которых определяются данными в основной таблице  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
inner join + union all

для спящего время бодрствования равносильно сну
17 июл 09, 19:20    [7431332]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить