2017-06-25 37 views
1

这些都是我的表:Sql字符串不等于加入?

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

我想选择所有的名称来自我的Mitarbeiter表,谁的Projektname“优化处理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'; 

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

回答

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' 
       ); 
+0

感谢。这工作。你能解释一下......(选择1来自Arbeitet_An)吗? 1做什么? – Hansanho

+0

@Hansanho。 。 。这是一个相关的子查询。它检查子查询中的任何行是否匹配。注意'WHERE'子句中的连接到外部查询。 –

+0

是的,我明白了。因此,如果Where子句匹配,则返回1?谢谢戈登你帮助我很多,并节省了我的时间:D! – Hansanho

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' ; 
)