3 tablo ile SQL Inner-join?


330

Bir görünümde 3 tabloya katılmaya çalışıyorum; durum şu:

Bu Kolej Kampüsünde yaşamak için başvuran öğrencilerin bilgilerini içeren bir masam var. Her Öğrenci için Salon Tercihlerini (3 tanesi) listeleyen başka bir tablo var. Ancak bu tercihlerin her biri sadece bir Kimlik Numarasıdır ve Kimlik Numarasının üçüncü bir tabloda karşılık gelen bir Salon Adı vardır (bu veritabanını tasarlamamıştır ...).

Hemen hemen, INNER JOINtercihleri ​​ve bilgileri ile masada var, sonuç gibi bir şey ...

 John Doe | 923423 | Incoming Student | 005

Nerede 005olurdu HallID. Şimdi bunu HallID, bu tablonun bir HallIDve içerdiği üçüncü bir tabloyla eşleştirmek istiyorum HallName.

Sonuç olarak, sonucumun şöyle olmasını istiyorum ...

 John Doe | 923423 | Incoming Student | Foley Hall <---(INSTEAD OF 005)

Şu anda sahip olduğum şey:

SELECT
  s.StudentID, s.FName, 
  s.LName, s.Gender, s.BirthDate, s.Email, 
  r.HallPref1, r.HallPref2, r.HallPref3
FROM
  dbo.StudentSignUp AS s 
  INNER JOIN RoomSignUp.dbo.Incoming_Applications_Current AS r 
    ON s.StudentID = r.StudentID 
  INNER JOIN HallData.dbo.Halls AS h 
    ON r.HallPref1 = h.HallID

Yanıtlar:


503

Aşağıdakileri yapabilirsiniz (Tablo alanlarında vb. Tahmin ettim)

SELECT s.studentname
    , s.studentid
    , s.studentdesc
    , h.hallname
FROM students s
INNER JOIN hallprefs hp
    on s.studentid = hp.studentid
INNER JOIN halls h
    on hp.hallid = h.hallid

Birden fazla salon talebinize göre bunu bu şekilde yapabilirsiniz. Hall masanıza her bir oda tercihi için birden çok kez katılırsınız:

SELECT     s.StudentID
    , s.FName
    , s.LName
    , s.Gender
    , s.BirthDate
    , s.Email
    , r.HallPref1
    , h1.hallName as Pref1HallName
    , r.HallPref2 
    , h2.hallName as Pref2HallName
    , r.HallPref3
    , h3.hallName as Pref3HallName
FROM  dbo.StudentSignUp AS s 
INNER JOIN RoomSignUp.dbo.Incoming_Applications_Current AS r 
    ON s.StudentID = r.StudentID 
INNER JOIN HallData.dbo.Halls AS h1 
    ON r.HallPref1 = h1.HallID
INNER JOIN HallData.dbo.Halls AS h2
    ON r.HallPref2 = h2.HallID
INNER JOIN HallData.dbo.Halls AS h3
    ON r.HallPref3 = h3.HallID

1
Bu yalnızca tek bir tercihle çalışır, ancak 3 tercihle çalışmasını sağlamak için bunu nasıl düzenlemek isterim? (her tercih için bir sütun)
Bob Sanders

1
@BobSanders cevabımı güncelledi, o zaman HallPref numarasını istemiyorsanız bu sütunları bırakın
Taryn

46
SELECT column_Name1,column_name2,......
  From tbl_name1,tbl_name2,tbl_name3
  where tbl_name1.column_name = tbl_name2.column_name 
  and tbl_name2.column_name = tbl_name3.column_name

27
Bu cevap OP'ye orijinal hedeflere nasıl ulaşılacağını göstermek için makul bir açıklamadan yoksundur.
gaige

41

Eğer IDkatılmak için aynı 3 tablo varsa , bence şöyle olurdu:

SELECT * FROM table1 a
JOIN table2 b ON a.ID = b.ID
JOIN table3 c ON a.ID = c.ID

Sadece *tablolardan almak istediğiniz ile değiştirin .


6
SELECT table1.col,table2.col,table3.col 
FROM table1 
INNER JOIN 
(table2 INNER JOIN table3 
ON table3.id=table2.id) 
ON table1.id(f-key)=table2.id
AND //add any additional filters HERE

3

Şu ID Numberanda sahip olduğunuz ID Numberüçüncü tabloya bağlanan ikinci bir iç birleşime ihtiyacınız var . Sonrasında yerine ID Numbergöre Hall Nameve işte :)


2
SELECT * 
FROM 
    PersonAddress a, 
    Person b,
    PersonAdmin c
WHERE a.addressid LIKE '97%' 
    AND b.lastname LIKE 'test%'
    AND b.genderid IS NOT NULL
    AND a.partyid = c.partyid 
    AND b.partyid = c.partyid;

2

Çok sayıda cevap vardı ama genel ders bir where yan tümcesinde birden fazla JOINS kullanabileceğiniz gibi görünüyor; Ayrıca techonthenet.com (patronum bana tavsiye etti, ben böyle buldum) başka bir sorunuz varsa ve sadece denemek ve anlamak istiyorsanız iyi SQL öğreticileri vardır.

SELECT table1.column1
FROM table1
WHERE table1 > 0 (or whatever you want to specify)
INNER JOIN table1 
ON table1.column1 = table2.column1

1

Bu, aynı kimliğe sahip birleştirme 3 tablosu için doğru sorgu **

select a.empname,a.empsalary,b.workstatus,b.bonus,c.dateofbirth from employee a, Report b,birth c where a.empid=b.empid and a.empid=c.empid and b.empid='103';

çalışanın ilk masası. rapor ikinci tablo. doğum üçüncü tablo


1
SELECT 
A.P_NAME AS [INDIVIDUAL NAME],B.F_DETAIL AS [INDIVIDUAL FEATURE],C.PL_PLACE AS [INDIVIDUAL LOCATION]
FROM 
[dbo].[PEOPLE] A
INNER JOIN 
[dbo].[FEATURE] B ON A.P_FEATURE = B.F_ID
INNER JOIN 
[dbo].[PEOPLE_LOCATION] C ON A.P_LOCATION = C.PL_ID

1

Bu sorgu sizin için çalışacak

Select b.id as 'id', u.id as 'freelancer_id', u.name as 
'free_lancer_name', p.user_id as 'project_owner', b.price as 
'bid_price', b.number_of_days as 'days' from User u, Project p, Bid b 
where b.user_id = u.id and b.project_id = p.id

1
select products.product_id, product_name, price, created_at, image_name, categories.category_id, category_name,brands.brand_id, brand_name 
FROM products INNER JOIN categories USING (category_id) INNER JOIN brands USING(brand_id)

-5
select empid,empname,managename,[Management ],cityname  
from employees inner join Managment  
on employees.manageid = Managment.ManageId     
inner join CITY on employees.Cityid=CITY.CityId


id name  managename  managment  cityname
----------------------------------------
1  islam   hamza       it        cairo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.