2016-10-05 2 views
0

Ich habe 3 Tabellen, die den Nutzern einen ihre RechteSQL Beziehungen zu Beziehungstabelle hinzufügen

Employee 
+-----------+------+ 
|EmployeeID | Name | 
+-----------+------+ 
|1   |Tim | 
|2   |Tom | 
+-----------+------+ 

Right 
+-----------+------+ 
|RightID |Name | 
+-----------+------+ 
|1   |Read | 
|2   |Write | 
|3   |Change| 
+-----------+------+ 

EmployeeRight 
+-----------+--------+ 
|EmplyeeID | RightID| 
+-----------+--------+ 
|1   |1  | 
|1   |2  | 
|2   |1  | 
+-----------+--------+ 

Jetzt schaffe ich brauche alle Benutzer das Recht „Change“, die das Recht „Schreiben“ zu geben haben. Aber Benutzer, die dieses Recht bereits haben, sollten es nicht zweimal bekommen.

Mein aktueller Versuch nicht funktioniert:

INSERT INTO EmployeeRight 
(SELECT '3', EmployeeID FROM EmployeeRight WHERE RightID = 2 AND RightID !=3) 

Antwort

1

Innerhalb einer einzigen Reihe RightID können nicht beide 2 und <>2 sein, müssen Sie eine Abfrage wie folgt direkt aus Employee-right Tabelle abfragen:

INSERT INTO EmployeeRight 
SELECT EmployeeID, 3 
FROM EmployeeRight 
WHERE RightID = 2 -- existing right 2 
    AND EmployeeID NOT IN 
    (
    SELECT EmployeeID 
    FROM EmployeeRight 
    WHERE RightID = 3 -- but not those who already have right 3 
    ) 
1

die unten stehende Skript verwenden.

INSERT INTO Employee-Right 
SELECT EmployeeID,3 
FROM Employyee E 
WHERE EXISTS (SELECT 1 
FROM Employee-Right ER WHERE E.EmployeeID=ER.EmployeeID AND ER.Right=2) 
    AND NOT EXISTS (SELECT 1 
FROM Employee-Right ER WHERE E.EmployeeID=ER.EmployeeID AND ER.Right=3) 

oder Sie können

INSERT INTO Employee-Right 
SELECT DISTINCT EmployeeID,3 
FROM Employee-Right ER 
WHERE ER.Right=2 
    AND NOT EXISTS (SELECT 1 
FROM Employee-Right ER1 WHERE ER.EmployeeID=ER1.EmployeeID AND ER.Right=3) 
+0

danke +1 für beide, aber das Entsprechen durch'EmpolyeeID' ist ein bisschen eleganter im Vergleich zu 'SELECT1' – Toshi

+0

NOT IN wird nicht funktionieren, wenn die Unterabfrage NULL value.say zurückgibt, wenn Sie keinen Angestellten mit haben RightID = 3 bereits in Ihrer Tabelle Employee-Right, es gibt null zurück und Ihre Abfrage schlägt fehl. –

+0

Das 'NOT IN' wird nur dann fehlschlagen, wenn eine Zeile mit einer NULL EmployeeID zurückgegeben wird. Da die 'EmployeeRight'-Tabelle eine assoziative Tabelle ist, sollte sie eine Primary Key-Einschränkung für die Kombination' EmplyeeID/RightID' haben, die NULL unmöglich macht (sonst können Sie noch eine 'WHERE EmployeeID IS NOT NULL' hinzufügen) – dnoeth

0

versuchen Sie unten Abfrage

  INSERT INTO EmployeeRight  
      select E.EmployeeID,'3' as RightID from Employee E 
      left join EmployeeRight ER on ER.EmplyeeID = E.EmployeeID 
      left join Right r on r.RightID=ER.RightID 
      where er.RightID = 2 and er.RightID != 3 
Verwandte Themen