SQL bên trong tham gia với 3 bảng?


330

Tôi đang cố gắng tham gia 3 bảng trong một khung nhìn; đây là tình huống:

Tôi có một bảng chứa thông tin của các sinh viên đang nộp đơn để sống trong khuôn viên trường Cao đẳng này. Tôi có một bảng khác liệt kê Tùy chọn Hội trường (3 trong số đó) cho mỗi Học sinh. Nhưng mỗi tùy chọn này chỉ là một Số ID và Số ID có Tên hội trường tương ứng trong bảng thứ ba (không thiết kế cơ sở dữ liệu này ...).

Khá nhiều, tôi có INNER JOINtrên bàn với sở thích của họ, và thông tin của họ, kết quả là ...

 John Doe | 923423 | Incoming Student | 005

Nơi nào 005sẽ là HallID. Vì vậy, bây giờ tôi muốn khớp nó HallIDvới bảng thứ ba, trong đó bảng này chứa a HallIDHallName.

Quá nhiều, tôi muốn kết quả của mình giống như ...

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

Đây là những gì tôi hiện có:

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

Câu trả lời:


503

Bạn có thể làm như sau (tôi đoán trên các trường bảng, v.v.)

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

Dựa trên yêu cầu của bạn cho nhiều hội trường, bạn có thể làm theo cách này. Bạn chỉ cần tham gia trên bàn Hall của bạn nhiều lần cho mỗi id phòng trước:

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
Điều này hoạt động chỉ với một ưu tiên, nhưng tôi muốn chỉnh sửa nó như thế nào để làm cho nó hoạt động với 3 ưu tiên? (một cột cho mỗi sở thích)
Bob Sanders

1
@BobSanders vừa cập nhật câu trả lời của tôi, sau đó nếu bạn không muốn số HallPref chỉ cần bỏ các cột đó
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
Câu trả lời này thiếu lời giải thích hợp lý để chỉ cho OP cách đạt được các mục tiêu ban đầu.
gaige

41

Nếu bạn có 3 bảng giống nhau IDđể tham gia, tôi nghĩ nó sẽ như thế này:

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

Chỉ cần thay thế *bằng những gì bạn muốn nhận được từ các bảng.


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

Bạn chỉ cần một phép nối bên trong thứ hai liên kết cái ID Numbermà bạn có bây giờ với ID Numberbảng thứ ba. Sau đó, thay thế ID Numberbởi Hall Namevà voilá :)


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

Đã có rất nhiều câu trả lời nhưng bài học tổng thể dường như là bạn có thể sử dụng nhiều THAM GIA trong một mệnh đề where; còn techonthenet.com (ông chủ của tôi đã giới thiệu nó cho tôi, đó là cách tôi tìm thấy nó) có các hướng dẫn SQL tốt nếu bạn có một câu hỏi khác và bạn chỉ muốn thử và tìm ra nó.

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

1

Đây là truy vấn chính xác để tham gia 3 bảng có cùng id **

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';

nhân viên bàn đầu tiên. báo cáo bảng thứ hai. sinh bảng thứ ba


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

Truy vấn này sẽ làm việc cho bạn

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.