Как сделать алгоритм присоединения в 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 и т. д.) находятся в другой базе данных, но это не имеет значения, мне просто нужен правильный способ их отображения, и я пойду дальше