Anticonformiste97 Ответов: 0

Как сделать алгоритм присоединения в SQL


Привет всем, я работаю над проектом (C# и SQL Server), где пользователь может выбрать некоторые поля для вывода select из нескольких таблиц в базе данных.
Я стою перед проблемой: как я могу справиться с проблемой соединения между таблицами, которые не связаны напрямую.
Например, между: [Compte] и [Encaissement].
Вы можете увидеть изображение или схему: Схема БД

Что я уже пробовал:

Я попробовал использовать таблицу сопоставления для хранения всех отношений между двумя таблицами, Изображение Стола.

И я сделал также хранимую процедуру, которая принимает 2 аргумента @table1 и @table2 для поиска связи в таблице сопоставления, она возвращает одну строку, если 2 таблицы непосредственно связаны, или одну строку, если между ними есть таблица ссылок.
Изображение Хранимой Процедуры.
Чтобы здесь все было хорошо и нормально работало, но мне нужен универсальный алгоритм, который может работать с N чернилами между таблицами в select query.

Спасибо, я буду очень благодарен вам за помощь.

Таков сценарий:
= = = = = = = = = = = = = = = = = = = = = = = =
use master;
go
set dateformat DMY
go
if exists (select * from
		   sys.databases where name='INTERMEDIAIRE')
		   drop database INTERMEDIAIRE;
go
create database INTERMEDIAIRE;
go
use INTERMEDIAIRE;
go
create table [Authentication](
	id int identity(1,1)
	constraint pk_auth primary key,
	username varchar(10) not null unique,
	mdp varchar(20) not null
);
go
create table Conditions(evenement varchar(255) not null,
						systeme varchar(255) not null,
						tempTable varchar(max) not null,
						constraint pk_events primary key(evenement,systeme));
go
create table Structures(id int identity(1,1)
					   constraint pk_conditions primary key,
					   champs varchar(max) not null,
					   [type] varchar(max) not null,
					   taille int not null,
					   nomFonctionnel varchar(max),
					   ref_event varchar(max),
					   sysTable varchar(max) not null);
go
create table Mapping(table1 varchar(255) not null,
					 table2 varchar(255) not null,
					 key1 varchar(max) not null,
					 key2 varchar(max) not null,
					 constraint pk_map primary key(table1,table2));
go
--Inserttion Of Records
insert into [Authentication] values('user1','pass1');
insert into [Authentication] values('user2','pass2');
go
insert into Conditions values('Facturation','Vectis','TmpFactVectis');
go
--the table [Structures] Will be filled from an Excel file in My Application(Does Not Matter for now)
--There are the datas If you need them
/*
id	champs				type	taille	nomFonctionnel		ref_event	sysTable
==  ================    ======= ======  ================    =========== =============
1	ref_facture			int		5		IdFacture			Facturation	Facture
2	num_contrat_fact	int		6		Ncontrat			Facturation	Facture
3	dateFacture			date	10		DateFact			Facturation	Facture
4	id_client			int		6		Id_Acheteur			Facturation	Client
5	num_contrat_cli		int		6		Contrat_Client		Facturation	Client
6	nom					varchar	255		Nom_Client			Facturation	Client
7	type				varchar	15		Type_Client			Facturation	Client
8	qte					int		3		Qte					Facturation	DetailFacture
9	prix				decimal	15		Prix				Facturation	DetailFacture
10	tax					decimal	3		TVA					Facturation	DetailFacture
11	montant_paye		decimal	15		MtEncaissement		Facturation	Encaissement
12	date_operation		date	10		DtEncaissement		Facturation	Encaissement
13	type_operation		varchar	20		TypeEncaissement	Facturation	Encaissement
14	date_paiment		date	10		DtPaiment			Facturation	Paiment
15	montant_total		decimal	15		MtTTC				Facturation	Paiment
*/
go
insert into Mapping values('Client','Facture','id_client','client');
insert into Mapping values('DetailFacture','Facture','facture','ref_facture');
insert into Mapping values('Encaissement','Facture','facture','ref_facture');
insert into Mapping values('Paiment','Facture','facture','ref_facture');
insert into Mapping values('Compte','Client','id_compte','compte');
insert into Mapping values('Auth','Compte','id_auth','auth');
go
--Create the stored procedure responsible of the mapping
create procedure sp_GetMapping
@t1 varchar(255),@t2 varchar(255)
as
BEGIN
	--the cases when (table1=@t1 & table2=@tb) OR (table1=@t2 & table2=@t1)
	if exists(select * from Mapping where (table1=@t1 and table2=@t2))
		select * from Mapping where (table1=@t1 and table2=@t2)
	else if exists(select * from Mapping where (table1=@t2 and table2=@t1))
		select * from Mapping where (table1=@t2 and table2=@t1)
	--End of the two cases
	else
		--the query responsible to find the link table between two tables (@t1 and @t2)
		select * from Mapping
		where ((table1=@t1 and table2=(select table2 from Mapping where table1=@t2)) or
			   (table1=@t2 and table2=(select table2 from Mapping where table1=@t1))) 
			  or
			  ((table2=@t1 and table1=(select table1 from Mapping where table2=@t2))or
			   (table2=@t2 and table1=(select table1 from Mapping where table2=@t1)))
			  or
			  ((table1=@t1 and table2=(select table1 from Mapping where table2=@t2))or
			   (table2=@t2 and table1=(select table2 from Mapping where table1=@t1)))
			  or
			  ((table1=@t2 and table2=(select table1 from Mapping where table2=@t1))or
			   (table2=@t1 and table1=(select table2 from Mapping where table1=@t2)))
END
go
select * from Authentication;
select * from Conditions;
select * from Structures;
select * from Mapping;
go
= = = = = = = = = = = = = = = = = = = = = = = =

CHill60

Вместо того чтобы размещать фотографию SP за пределами сайта, просто разместите код здесь. То же самое и с вашими данными. Возможно, вы найдете мое решение для этого поста Получите таблицы сопоставления между двумя таблицами.[^] полезный

Anticonformiste97

Спасибо, холодок, но это было не очень полезно, я не думаю, что это достаточно нежелательно

Andy Lanng

ЮС-как говорит чилл, размести код здесь, где сможешь. Отлично подходит для изображения схемы, но если мы хотим проверить, то лучше всего позволить нам скопировать/вставить. Все здесь находятся здесь добровольно, и то, что мы печатаем больше, чем нам нужно, препятствует взаимодействию.

Если вы хотите идеального взаимодействия, то вы даже можете опубликовать сценарий для создания таблиц, отношений и тестовых данных. Больше работы для вас, но это лишняя Миля для одного человека и лишняя Миля для всех остальных. Кроме того, надеюсь, вы знаете, как написать этот сценарий из вашей существующей базы данных. Вам, 1-му человеку, легче, чем всем нам, попробовать одно и то же. ^_^

PS: добро пожаловать. Мы здесь, чтобы помочь :Þ

Andy Lanng

О. Еще одна вещь... Какой инструмент вы использовали для создания процедуры? Это крайне неэффективно. Это может быть быстро, теперь это ооочень не масштабируемо для больших наборов данных

Anticonformiste97

SQL server management studio, я написал его вручную, пожалуйста, если вы можете дать мне некоторые объяснения, чтобы улучшить его

Andy Lanng

О, так много. не могли бы вы сделать мою жизнь проще и дать мне сценарий для:
создание таблиц и связей. Вы можете сделать это с помощью sql mgmt studio
плюс дайте мне несколько образцов данных для заполнения таблиц. Просто чтобы я мог воссоздать приведенный вами пример

Я могу давать советы и без них, но мне потребуется время, чтобы привести примеры. Я не думаю, что давать вам абстрактные объяснения будет очень полезно.

Если вы думаете иначе, то я могу опубликовать пересмотр, но уже довольно поздно, и вы получите ответ только завтра (10-12 часов) в любом случае.

Я подсел на эту ленту. Я могу решить эту проблему. Я не оставлю тебя в покое!

Andy Lanng

PS: сейчас здесь 21: 30. Какой это ваш часовой пояс по сравнению (Я GTM DS). Я не хочу оставлять вас в подвешенном состоянии, так как мы можем работать вместе, чтобы решить эту проблему самым простым способом.

Andy Lanng

Прекрасно-я первым делом займусь этим.

Спасибо за вашу помощь

Andy Lanng

О, вы говорите по-французски? А я нет кстати

Andy Lanng

..: Ваш английский лучше, чем у большинства английских ppl, которых я знаю

Andy Lanng

Если вы можете: пожалуйста, переведите ваши комментарии на английский язык. Извините, но я говорю только по-техническому :P

Я могу запустить это через google translate, если понадобится

Anticonformiste97

Спасибо Энди < 3, Хорошо, я переведу их сейчас.
PS: имейте в виду, что таблицы (клиент, DetailsCommande и т. д.) находятся в другой базе данных, но это не имеет значения, мне просто нужен правильный способ их отображения, и я пойду дальше

0 Ответов