Sql String不等联接?

时间:2017-06-25 18:13:51

标签: sql oracle

这些是我的表格:

MITARBEITER (mid, mname, abtid*)
PROJEKT (prjid, prjname, prjleiter*)
ARBEITSPAKETE (prjid, apid, apbezeichnung, umfangstd)
ARBEITET_AN (mid*, prjid*, apid*, anzahlstd)
ABTEILUNG (abtid, abtname)

我想从我的Mitarbeiter表中选择所有名字,他们没有为Projektname“Optimierung Einkauf”工作。

这是我的Sql:

SELECT DISTINCT MITARBEITER.mname
FROM MITARBEITER
JOIN ARBEITET_AN
ON MITARBEITER.MID = ARBEITET_AN.MID
JOIN ARBEITSPAKETE
ON ARBEITET_AN.prjid = ARBEITSPAKETE.prjid
JOIN PROJEKT
ON ARBEITSPAKETE.prjid = PROJEKT.prjid
where NOT (PROJEKT.prjname = 'Optimierung Einkauf') ;

我试过了:

SELECT DISTINCT MITARBEITER.mname
FROM MITARBEITER
JOIN ARBEITET_AN
ON MITARBEITER.MID = ARBEITET_AN.MID
JOIN ARBEITSPAKETE
ON ARBEITET_AN.prjid = ARBEITSPAKETE.prjid
join PROJEKT
ON ARBEITSPAKETE.prjid = PROJEKT.prjid
where PROJEKT.prjname <> 'Optimierung Einkauf';

为什么我得到为Projekt工作的Mitarbeiter?

2 个答案:

答案 0 :(得分:1)

我在想NOT EXISTSNOT IN

SELECT ma.mname
FROM MITARBEITER ma
WHERE NOT EXISTS (SELECT 1
                  FROM ARBEITET_AN a JOIN
                       ARBEITSPAKETE asp
                       ON a.prjid = asp.prjid JOIN 
                       PROJEKT p
                       ON asp.prjid = p.prjid
                  WHERE ma.MID = a.MID AND p.prjname = 'Optimierung Einkauf'
                 );

答案 1 :(得分:1)

您可以使用anot输入适用于您不想要的项目的所有名称

SELECT DISTINCT MITARBEITER.mname
FROM MITARBEITER
JOIN ARBEITET_AN ON MITARBEITER.MID = ARBEITET_AN.MID
JOIN ARBEITSPAKETE ON ARBEITET_AN.prjid = ARBEITSPAKETE.prjid
where MITARBEITER.mname not in (
    SELECT DISTINCT MITARBEITER.mname
    FROM MITARBEITER
    JOIN ARBEITET_AN ON MITARBEITER.MID = ARBEITET_AN.MID
    JOIN ARBEITSPAKETE ON ARBEITET_AN.prjid = ARBEITSPAKETE.prjid
    JOIN PROJEKT ON ARBEITSPAKETE.prjid = PROJEKT.prjid 
          and PROJEKT.prjname = 'Optimierung Einkauf' ;
)