假設我們有三張表學生表、課程表和教師表,就像這樣
“學生”表
| 標準識別符號 | 標準名稱 | 課程編號 | 教師編號 |
|---|---|---|---|
| 1個 | 拉梅什 | 1個 | 1個 |
| 2個 | 象頭神 | 1個 | 3個 |
| 3個 | 阿德什 | 3個 | 3個 |
| 4個 | 尼勒什 | 3個 | 1個 |
| 5個 | 索南 | 3個 | 4個 |
| 6個 | 阿比 | 2個 | 4個 |
| 7 | 阿尼爾 | 2個 | 4個 |
“課程”表
| 課程編號 | 課程名 | 標準識別符號 | 教師編號 |
|---|---|---|---|
| 1個 | JAVA | 1個 | 1個 |
| 2個 | JavaScript | 1個 | 2個 |
| 3個 | 網路 | 1個 | 1個 |
| 4個 | C#.NET | 5個 | 2個 |
| 5個 | PYTHON | 5個 | 4個 |
| 6個 | 樹液 | 6個 | 4個 |
| 7 | C | 6個 | 1個 |
“老師”表
| 教師編號 | 老師的名字 | 課程編號 | 標準識別符號 |
|---|---|---|---|
| 1個 | 羅伊 | 1個 | 1個 |
| 2個 | 阿米特 | 2個 | 1個 |
| 3個 | 約翰 | 1個 | 5個 |
| 4個 | 約格什 | 3個 | 5個 |
| 5個 | 洛基 | 3個 | 1個 |
所以在這里我給出了三個表格,所以現在我想顯示有課程的學生和老師。
所以在這里你可以看到在“學生”表中我們有 std_id 和 course_id 在“課程”表中我們有 course_id 和 std_id
所以你可以在學生表中看到我們有 std_id 和 course_id 在課程表中我們有 course_id 和 std_id
那么這里應該使用哪一列來連接學生表和課程表?
因為兩個表都有 std_id 和 course_id,如果我想顯示有課程的學生,那么應該在此處使用哪一列來加入學生表和課程表?
在這里,我還想向教師展示,所以在教師表中,我們有 teacher_id 和 course_id,這里有 std_id,應該使用哪個表列來連接教師表,因為學生表也有 teacher_id,課程表也有teacher_id 所以這里應該使用哪個表 teacher_id 來加入教師表?
請讓我知道伙計們我怎么知道應該在這里使用哪個專欄加入?
uj5u.com熱心網友回復:
想想從左到右的重要性。
如果您的主要重點是顯示學生和他們選修的課程,那么學生表位于左側。如果您的主要關注點是顯示課程以及哪些學生參加了這些課程,則課程表位于左側。如果您的主要關注點是展示 Teacher 和他們教授的課程,那么 teacher 表就在左邊。
從那里開始,根據需要使用盡可能多的左連接。因此,如果您的主要重點是向學生展示他們選修的課程,請將 Students 表從外部連接到 Students.Course_ID = Courses.Course_ID 上的 Courses 表。然后,您可以在 Course.Teacher_ID = Teacher.Teacher_ID 上將 Courses 表左外聯接到 Teachers 表。
老實說,我認為您可以從 Students 表中洗掉 Teacher_ID,因為教師與課程相關聯,而不是與學生相關聯。同樣,您可以從 Course 和 Teacher 表中洗掉 Student_ID,因為這最終會創建多個記錄。建表的目的其實就是盡量減少1:Many join的可能性。
uj5u.com熱心網友回復:
這是一個關于如何連接所有東西的 SQL 小提琴。這是一種方法,要獲得準確的答案,您必須發布更準確的問題。正如我在評論中所說,原始資料結構需要修復。不需要每個表都參考其他每個表。最好按目的隔離資料。例如,教師表不應參考學生表,除非它們之間存在某種直接關系。在這種情況下,老師將與他們教授的課程產生邏輯關系……但沒有理由鏈接到學生。學生被分配到一門課程。按照資料結構化的方式,學生和課程之間只能存在一對一的關系(除非您不必要地復制了大量資料)。我修復了資料結構,然后創建了JOIN以合乎邏輯的方式。我列出了所有課程,添加了誰教這門課程,然后提供了該課程的注冊學生名單。
SQL小提琴
MS SQL Server 2017 架構設定:
CREATE TABLE student (
std_id int not null
, std_name nvarchar(50) not null
);
CREATE TABLE course (
course_id int not null
, course_name nvarchar(50) not null
, teacher_id int null
);
CREATE TABLE teacher (
teacher_id int not null
, teacher_name nvarchar(50) not null
);
CREATE TABLE course_x_student (
uid int IDENTITY(1,1) not null
, course_id int not null
, std_id int not null
);
INSERT INTO student (std_id, std_name)
VALUES (1, 'Ramesh')
, (2, 'Ganesh')
, (3, 'Aadesh')
, (4, 'Nilesh')
;
INSERT INTO teacher (teacher_id, teacher_name)
VALUES (1, 'Roy')
, (2, 'Amit')
;
INSERT INTO course (course_id, course_name, teacher_id)
VALUES (1, 'JAVA', 1)
, (2, 'JAVASCRIPT', 1)
, (3, 'VB.NET' , 2)
;
INSERT INTO course_x_student (std_id, course_id)
VALUES (1, 1)
, (2, 1)
, (3, 3)
, (4, 3)
;
查詢 1:
SELECT
c.*
, t.teacher_name
, STUFF((
SELECT ',' CAST(s.std_id as nvarchar) ':' s.std_name
FROM student as s
INNER JOIN course_x_student as cxs
ON cxs.std_id = s.std_id
AND cxs.course_id = c.course_id
FOR XML PATH('')
),1,1,'') as student_list
FROM course as c
LEFT OUTER JOIN teacher as t
ON t.teacher_id = c.teacher_id
結果:
| course_id | course_name | teacher_id | teacher_name | student_list |
|-----------|-------------|------------|--------------|-------------------|
| 1 | JAVA | 1 | Roy | 1:Ramesh,2:Ganesh |
| 2 | JAVASCRIPT | 1 | Roy | (null) |
| 3 | VB.NET | 2 | Amit | 3:Aadesh,4:Nilesh |
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/533829.html
標籤:数据库sql服务器
上一篇:作業組中的IIS、.NETCore6和SQLServer連接
下一篇:如何查找所有表取決于存盤程序
