簡體   English   中英

如何根據具有相同 ID 的字段從表中獲取 select 值?

[英]How to select values from table based on field with the same id?

假設我有以下 sql 表:

表“學生

ID
1個 莉蓮 需要
2個 威廉 洛倫茲
3個 瑪麗 摩爾
4個 吉賽爾 柯林斯
5個 詹姆士 莫爾特里
6個 約翰 羅德里格斯

表“ exam_result ”:

exam_result_id 主題編號 學生卡 標記
1個 2個 1個 49
2個 2個 2個 21
3個 1個 3個 81
4個 4個 1個 33
5個 4個 2個 19
6個 3個 2個 46
7 1個 5個 55
8個 3個 5個 75
9 2個 5個 60
11 1個 6個 86
12 2個 6個 92
13 3個 6個 48歲
14 4個 6個 78

我需要 select 所有考試成績 <50 或根本沒有參加任何考試的學生。

因此,在這種情況下,我需要 ID 為 1、2 和 4 的學生。

我想到的最接近的是以下查詢,但它給出了 ID 為 1、2、4 和 6 的學生。我不需要 ID 為 6 的學生,因為他只有 1 次考試不及格,而不是全部。

SELECT DISTINCT s.id, s.first_name, s.last_name
FROM university.student s
LEFT JOIN
    university.exam_result er ON
        s.id = er.student_id
WHERE er.mark < 50 OR er.mark IS NULL;

我需要它在 PostgreSQL 和 MariaDB 中工作,所以我不想要任何特定於它們的東西。

有效的查詢是:

SELECT DISTINCT s.id, s.first_name, s.last_name
FROM university.student s
WHERE NOT EXISTS(SELECT 1 FROM university.exam_result er WHERE s.id = er.student_id AND er.mark > 49);

謝謝@jarlh 的評論。

我會結合檢查標記使用 NOT EXISTS 條件

select s.*
from student s
where not exists (select * 
                  from exam_result er
                  where er.student_id = s.id)
   or 50 >= all (select er.mark
                 from exam_result er
                 where er.student_id = s.id)

一種選擇是通過聚合來做到這一點,方法是確保小於 50 的標記數等於它們的所有標記數。 當學生的分數為 0 分時,條件仍然滿足。

SELECT s.id, s.first_name, s.last_name
FROM      student s
LEFT JOIN exam_result er ON s.id = er.student_id
GROUP BY s.id, s.first_name, s.last_name
HAVING COUNT(CASE WHEN er.mark < 50 THEN 1 END) = COUNT(er.mark)

檢查MariaDB 演示PostgreSQL 演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM