[英]SQL JOIN with WHERE condition when two rows' values are the same and one row matches to two different rows
我有這些表:
CREATE TABLE students(
id int NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL
);
CREATE TABLE studentsActivities(
studentId int NOT NULL,
activity VARCHAR(30) NOT NULL,
PRIMARY KEY (studentId, activity),
foreign KEY (studentId) REFERENCES students(id)
);
我必須返回所有打網球或足球的學生姓名。 但是,有一個我無法通過的測試用例,它是這樣說的:
同名學生。
我不知道測試用例的確切實現,但我懷疑是學生 A 叫 Carl 打網球,學生 B 也叫 Carl 打足球,Carl 出現兩次的情況。 我如何查詢該數據庫以獲得這樣的結果? 我創建了演示庫來嘗試:
CREATE TABLE students(
id int NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL
);
CREATE TABLE studentsActivities(
studentId int NOT NULL,
activity VARCHAR(30) NOT NULL,
PRIMARY KEY (studentId, activity),
foreign KEY (studentId) REFERENCES students(id)
);
INSERT INTO students
VALUES
(1, "Jeremy"),
(2, "Hannah"),
(3, "Luke"),
(4, "Frank"),
(5, "Sue"),
(6, "Sue"),
(7, "Peter");
INSERT INTO studentsActivities
VALUES
(1, "Tennis"),
(1, "Football"),
(2, "Running"),
(3, "Tennis"),
(4, "Football"),
(5, "Football"),
(6, "Tennis");
SQL 小提琴讓我們假設傳遞集是:
Jeremy
Luke
Frank
Sue
Sue
我已經嘗試過這兩個查詢,但沒有一個給出正確的答案。
--- 1
SELECT s.name
FROM students s
JOIN studentsActivities sa
ON sa.studentId = s.id
WHERE activity = "Tennis"
UNION
SELECT s.name
FROM students s
JOIN studentsActivities sa
ON sa.studentId = s.id
WHERE activity = "Football"
--- Returns Frank Jeremy Luke Sue (missing one Sue)
--- 2
SELECT s.name
FROM students s
JOIN studentsActivities sa
ON sa.studentId = s.id
WHERE activity = "Tennis"
OR activity = "Football"
ORDER BY s.name;
--- Returns Frank Jeremy Jeremy Luke Sue Sue (too much Jeremies)
您可以使用exists
:
select s.*
from students s
where exists (
select 1
from studentsActivities sa
where sa.studentId = s.id and sa.activity in ('Tennis', 'Football')
)
id | name -: | :----- 1 | Jeremy 3 | Luke 4 | Frank 5 | Sue 6 | Sue
加入表格,僅過濾包含您想要的活動的行並返回不同的行:
select distinct s.id, s.name
from students s inner join studentsActivities a
on a.studentId = s.id
where a.activity in ('Tennis', 'Football')
見演示。
結果:
| id | name |
| --- | ------ |
| 1 | Jeremy |
| 3 | Luke |
| 4 | Frank |
| 5 | Sue |
| 6 | Sue |
如果您只想要沒有 id 的學生姓名:
select s.name
from students s inner join studentsActivities a
on a.studentId = s.id
where a.activity in ('Tennis', 'Football')
group by s.id, s.name
見演示。
結果:
| name |
| ------ |
| Jeremy |
| Luke |
| Frank |
| Sue |
| Sue |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.