2016-05-02 16 views
-2

Ich habe vier Tabellen - tblBase, tblLookup, tblData und tblData2Joining 3 Tabellen basierend auf gemeinsamen Spalten

tblBase

+---------+----------+-----------+------------+ 
| Base_ID | Base_Num | Base_Type | Base_Date | 
+---------+----------+-----------+------------+ 
|  1 |  1234 | ABC  | 01/05/2016 | 
|  2 |  3456 | DEF  | 02/05/2016 | 
|  3 |  7890 | GHI  | 03/05/2016 | 
+---------+----------+-----------+------------+ 

tblLookup

+-----------+-------------+ 
| Lookup_ID | Lookup_Name | 
+-----------+-------------+ 
|   1 | Apple  | 
|   2 | Orange  | 
|   3 | Banana  | 
+-----------+-------------+ 

tblDat ein

+-----------+----------+------------+ 
| Data_Name | Data_Num | Data_Date | 
+-----------+----------+------------+ 
| Apple  |  1234 | 02/05/2016 | 
| Orange |  3456 | 03/05/2016 | 
| Guava  |  5937 | 04/05/2016 | 
+-----------+----------+------------+ 

tblData2

+------------+-----------+------------+ 
| Data2_Name | Data2_Num | Data2_Date | 
+------------+-----------+------------+ 
| Grapes  |  3953 | 02/05/2016 | 
| Orange  |  3456 | 03/05/2016 | 
| Banana  |  7890 | 04/05/2016 | 
| Banana  |  1473 | 07/05/2016 | 
+------------+-----------+------------+ 

ich die Data_Date von tblData oder tblData2 (wo auch immer die Daten vorhanden sind) verbinden mit tblBase wo Base_Num Spiele zu bekommen versuche. Da die allgemeinen Spalten in tblLookup existieren, muss ich alle vier Tabellen verbinden.

Zum Beispiel Base_ID = 3, Base_Num = 7890 sollte Data_Date von tblData2, da beide Base_ID (Banana) und Base_Num (7890) Matches abholen.

Ich versuchte, INNER JOIN zu tun, aber es gab nicht das gewünschte Ergebnis.

Ich bin für eine resultierende Tabelle wie folgt aussehen:

+---------+----------+-----------+------------+-------------------+ 
| Base_ID | Base_Num | Base_Type | Base_Date | Desired_Data_Date | 
+---------+----------+-----------+------------+-------------------+ 
|  1 |  1234 | ABC  | 01/05/2016 | 02/05/2016  | 
|  2 |  3456 | DEF  | 02/05/2016 | 03/05/2016  | 
|  3 |  7890 | GHI  | 03/05/2016 | 04/05/2016  | 
+---------+----------+-----------+------------+-------------------+ 
+0

sicherlich Ihre Antwort bekommen würde helfen, früher, wenn Sie Ihre Post bearbeiten schließen die SQL, die Sie bereits versucht haben, die nicht das gewünschte Ergebnis produziert – dinotom

+0

Dinotom, als INNER JOIN gab mir das Ergebnis nicht, versuchte ich JOIN. Aber ich kann nur einer Datentabelle beitreten, nicht den beiden Datentabellen. Hier ist mein Code: 'SELECT A. *, C.Data_Date VON tblBase A \t JOIN tblLookup B auf A.Base_ID = B.Lookup_ID \t JOIN tblData C auf B.Lookup_Name = C.Data_Name UND C.Data_Num = A.Base_Num ' – Shanka

+0

Base_ID = 2 Base_num = 3456 (orange) Ergebnis könnte von tbldata oder tbldata2 kommen - wie soll dieser (und andere Duplikate) behandelt werden? –

Antwort

1

Sie können versuchen, LEFT JOIN

SELECT B.Base_ID, B.Base_Num , B.Base_Type, B.Base_Date, 
D1.Data_Name AS Data1, D1.Data_Date AS DESIRED_DATE1 
D2.Data2_Name AS Data2, D2.Data2_Date AS DESIRED_ 

FROM tblBase B 

JOIN tblLookup L ON L.Lookup_ID=B.Base_ID 
LEFT JOIN tblData D1 ON D1.Data_Num = B.Base_Num 
LEFT JOIN tblData2 D2 ON D2.Data2_Num = B.Base_Num 
WHERE <Condition> 
0
declare @tblbase table (Base_ID int, Base_Num int, Base_Type varchar(3), Base_Date varchar(10)) 
Insert into @tblbase 
values 
(  1 ,  1234 , 'ABC', '01/05/2016'), 
(  2 , 3456 , 'DEF', '02/05/2016'), 
(  3 , 7890 , 'GHI', '03/05/2016') 

declare @tblLookup table (Lookup_ID int, Lookup_Name varchar(10)) 
insert into @tblLookup  
values 
(  1 , 'Apple'), 
(  2 , 'Orange'), 
(  3 , 'Banana') 

declare @tbldata table (Data_Name varchar(10), Data_Num int, Data_Date varchar(10)) 
Insert into @tbldata 
values 
('Apple' ,  1234 , '02/05/2016'), 
('Orange' ,  3456 , '03/05/2016'), 
('Guava' ,  5937 , '04/05/2016') 

declare @tbldata2 table (Data_Name varchar(10), Data_Num int, Data_Date varchar(10)) 
Insert into @tbldata2 
values 
('Grapes',   3953 , '02/05/2016'), 
('Orange' ,   3456 , '03/05/2016'), 
('Banana' ,   7890 , '04/05/2016'), 
('Banana' ,  1473 , '07/05/2016') 

/* 
Expected result 
+---------+----------+-----------+------------+-------------------+ 
| Base_ID | Base_Num | Base_Type | Base_Date | Desired_Data_Date | 
+---------+----------+-----------+------------+-------------------+ 
|  1 |  1234 | ABC  | 01/05/2016 | 02/05/2016  | 
|  2 |  3456 | DEF  | 02/05/2016 | 03/05/2016  | 
|  3 |  7890 | GHI  | 03/05/2016 | 04/05/2016  | 
+---------+----------+-----------+------------+-------------------+ 
*/ 
select bt.*,u.data_date as Desired_data_date 
from @tblbase bt 
join @tblLookup lu on lu.lookup_id = bt.base_id 
join 
(select t1.* from @tbldata t1 
union 
select t2.* from @tbldata2 t2 
) u 
on  u.data_name = lu.Lookup_Name 
where u.Data_Num = bt.Base_Num 
order by bt.Base_Date