因此,對于我的任務,我必須找一位(假設有一位)教授來監督 2020 年夏季學期的所有專案。我的想法是只計算監督教授的數量。如果為“1”,則選擇該教授的姓名,但如果有 2 位或更多教授,則不會選擇任何人。但是當我測驗我的代碼時,我得到了 2 個不同的教授,每個教授的計數都是“1”......
代碼看起來像這樣
SELECT DISTINCT Nachname, Vorname, COUNT (DISTINCT proj.prof_persID) AS Professoren
FROM Personal pers
JOIN Projekte proj
ON pers.persID = proj.prof_persID
WHERE proj.Semester = 'SS2020'
GROUP BY Nachname, Vorname
HAVING COUNT (proj.prof_persID) = 1;
指出我正確的方向肯定就足夠了,謝謝!
編輯
表格本身的示例
CREATE TABLE Personal (
PersID INTEGER GENERATED ALWAYS AS IDENTITY
CONSTRAINT PersPK PRIMARY KEY,
Nachname VARCHAR2(30) NOT NULL ,
Vorname VARCHAR2(30) NOT NULL ,
Telefonnr VARCHAR2(15) NULL ,
Email VARCHAR2(50) NOT NULL
CONSTRAINT pEmailSyntax CHECK (email LIKE '%@%.__'
OR email LIKE '%@$.___')
INITIALLY DEFERRED,
Raum VARCHAR2(5) NULL ,
Typ CHAR(1) NOT NULL
CONSTRAINT PersTypChk CHECK ( UPPER(typ) IN
('W','P','S','V') ) INITIALLY IMMEDIATE,
von DATE,
bis DATE);
CREATE TABLE Projekte (
ProjID INTEGER NOT NULL ,
Bezeichnung VARCHAR2(30) NOT NULL ,
Semester VARCHAR2(10) NOT NULL ,
maxGGroesse INTEGER NULL ,
Fach VARCHAR2(20) NULL ,
WMA_PersID INTEGER NULL ,
Prof_PersID INTEGER NULL ,
Freigeschaltet DATE NULL ,
CONSTRAINT PKProjekte PRIMARY KEY (ProjID),
CONSTRAINT freischaltenCck CHECK ( (freigeschaltet IS NOT NULL
AND Fach IS NOT NULL AND Prof_persID IS NOT NULL)
OR freigeschaltet IS NULL ) INITIALLY DEFERRED );
//SAMPLE DATA FOR "PERSONAL"
INSERT INTO Personal (Nachname, Vorname, Telefonnr, Email, Raum, Typ, von, bis)
VALUES ('Bauer', 'Erna', '02261 81961211', '[email protected]', '2230', 'P', TO_DATE('01.03.2019', 'DD.MM.RRRR'), NULL);
INSERT INTO Personal (Nachname, Vorname, Telefonnr, Email, Raum, Typ, von, bis)
VALUES ('Mecker', 'Else', '02261 81964222', '[email protected]', '2254', 'P', TO_DATE('16.06.2020', 'DD.MM.RRRR'), TO_DATE('20.02.2022', 'DD.MM.RRRR'));
//SAMPLE DATA FOR "PROJECTS"
INSERT INTO Projekte
VALUES (proj_seq.NEXTVAL, 'Oracle-Praktikumsprojekt', 'SS2020', 2, 'DBS1', NULL, 2, TO_DATE ('15.04.2020', 'DD.MM.RRRR'));
INSERT INTO Projekte
VALUES (proj_seq.NEXTVAL, 'Build-A-Bear Workshop', 'SS2020', 2, 'DBS1', NULL, 3, TO_DATE ('15.04.2020', 'DD.MM.RRRR'));
至于我的專案的兩個示例樣本,我希望我的程式不選擇任何內容,因為在“SS2020”中有多個教授監督至少一個專案,但它選擇了兩個給定的教授,每個教授的計數都為 1。
uj5u.com熱心網友回復:
小提琴
審查條款:
- 聚合函式
- 功能依賴
<group by clause>
給定GROUP BY name,這會<group by clause>為找到的每個不同的名稱值生成一個包含一行的結果。因此,如果有 2 位教授的名字各不相同(例如:'prof1' 和 'prof2'),GROUP BY name則會為每個組生成一個結果,并且您的后續COUNT(DISTINCT prof_id)運算式只會在每個組中找到一個教授,id 為 '第 1 組中的 prof1' 和第 2 組中的 'prof2' 的 id。
基本上,您不想在您的術語中包含FirstNameor ,因為這會導致每個具有不同名稱的教授在您的結果中形成一個單獨的組。你想對所選學期的所有教授做這樣的事情:LastNameGROUP BY
SELECT proj.Semester
, MIN(LastName) AS LastName, MIN(FirstName) AS FirstName
, COUNT (DISTINCT proj.prof_persID) AS Professors
FROM Personal pers
JOIN Projects proj
ON pers.persID = proj.prof_persID
WHERE proj.Semester = 'SS2020'
GROUP BY proj.Semester
HAVING COUNT (DISTINCT proj.prof_persID) = 1
;
結果:
| 學期 | 姓 | 名 | 教授 |
|---|---|---|---|
| SS2020 | 邁克 | 別的 | 1 |
我留在GROUP BY子句中,只包括學期,因此您可以擴展學期串列并一次獲得多個學期的結果。
您也可以只洗掉GROUP BY子句,然后將所有選定的行作為一組進行操作。如果您這樣做,請調整選擇串列。
像這樣:
SELECT MIN(proj.Semester) AS Semester
, MIN(Nachname) AS LastName, MIN(Vorname) AS FirstName
, COUNT (DISTINCT proj.prof_persID) AS Professors
FROM Personal pers
JOIN Projekte proj
ON pers.persID = proj.prof_persID
WHERE proj.Semester = 'SS2020'
HAVING COUNT (DISTINCT proj.prof_persID) = 1
;
或者只是這個:
SELECT MIN(Nachname) AS LastName, MIN(Vorname) AS FirstName
, COUNT (DISTINCT proj.prof_persID) AS Professors
FROM Personal pers
JOIN Projekte proj
ON pers.persID = proj.prof_persID
WHERE proj.Semester = 'SS2020'
HAVING COUNT (DISTINCT proj.prof_persID) = 1
;
您的原始查詢:
SELECT Nachname AS LastName, Vorname AS FirstName
, COUNT (DISTINCT proj.prof_persID) AS Professors
FROM Personal pers
JOIN Projekte proj
ON pers.persID = proj.prof_persID
WHERE proj.Semester = 'SS2020'
GROUP BY Nachname, Vorname
HAVING COUNT ( proj.prof_persID ) = 1
;
導致了這個(我在資料中添加了第二個教授行):
| 學期 | 姓 | 名 | 教授 |
|---|---|---|---|
| SS2020 | 邁克 | 別的 | 1 |
| SS2020 | 邁克2 | 其他2 | 1 |
更新了額外教授的小提琴
參見 的概念aggregate functions。
MIN是aggregate function如上所用的。
在這種情況下,它允許我們從組中獲取/提取其他列/運算式。
在任何一組教授中(在本學期),都可能有很多名字。
MIN(name) 只需選擇該組名稱中按字典順序/字母順序排列的名稱。
在您的特定問題中,最多會找到MIN(name)一位教授,該組中的一位教授的名字也是如此。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/407680.html
標籤:
上一篇:僅選擇聯系人長度不是5的用戶
