2016-06-21 8 views
0

Ich habe 2 tables, mit dem Namen SectionAccess bzw. AdminConsole. SectionAccess enthält die FelderSELECT Zeilen WHERE NICHT EXISTS Zustand von 2 Tabellen

- User Access 
- User ID 
- Link. 

1 Benutzer-ID kann ein paar Links haben. AdminConsole hat die Felder

- Link 
- Project ID (PPMID) 
- Application ID (EPRID) 
- Project Name. 

Jeder Link hat ein einzigartiges Projekt.

Ich erstelle eine webpage mit Razor, wo der Benutzer seine Benutzer-ID eingeben kann, und die Webseite zeigt die Projekte, die derzeit unter dieser Benutzer-ID in einer Tabelle sind. Die SQL-Abfrage, die ich dafür gemacht habe, lautet:

SELECT SectionAccess.Link, SectionAccess.UserID, AdminConsole.PPMID, AdminConsole.EPRID, AdminConsole.Proj_Name FROM SectionAccess 
INNER JOIN AdminConsole ON SectionAccess.Link=AdminConsole.Link 
WHERE SectionAccess.UserID like ('%" + Request["UserID"] + "%'); 

Das funktioniert großartig. Jetzt füge ich eine weitere Tabelle unterhalb dieser Tabelle hinzu, die die Projekte anzeigt, die NICHT an diese Benutzer-ID gebunden sind. Ich habe das gemacht, aber es gibt nichts zurück.

SELECT Link, PPMID, EPRID, Proj_Name FROM AdminConsole 
WHERE NOT EXISTS 
(SELECT SectionAccess.Link, SectionAccess.UserID, AdminConsole.PPMID, AdminConsole.EPRID, AdminConsole.Proj_Name FROM SectionAccess 
INNER JOIN AdminConsole ON SectionAccess.Link=AdminConsole.Link 
WHERE SectionAccess.UserID = '" + Request["UserID"] + "'); 

Was ist das Problem hier?

Antwort

0

Sie treten Adminconsole wieder innerhalb Ihrer Unterabfrage, während es durch Adminconsole von Ihrem Haupt Abfrage gefiltert werden soll.

Ihre Anfrage verlangen nicht, was Sie wollen:

SELECT Link, PPMID, EPRID, Proj_Name FROM AdminConsole 
WHERE NOT EXISTS 
(SELECT SectionAccess.Link, SectionAccess.UserID, AdminConsole.PPMID, AdminConsole.EPRID, AdminConsole.Proj_Name FROM SectionAccess 
INNER JOIN AdminConsole ON SectionAccess.Link=AdminConsole.Link 
WHERE SectionAccess.UserID = '" + Request["UserID"] + "'); 

Ihre Unterabfrage Zeilen nicht liefern, wenn der Benutzer mindestens ein Projekt hat. Daher ist nicht vorhanden ist falsch und Sie erhalten in diesem Fall keine Zeilen von AdminConsole.

Sie müssen Ihre Unterabfrage durch Ihre Hauptabfragen filtern AdminConsole.Link. Etwas wie:

SELECT Link, PPMID, EPRID, Proj_Name FROM AdminConsole 
WHERE NOT EXISTS 
(SELECT SectionAccess.Link, SectionAccess.UserID FROM SectionAccess 
WHERE SectionAccess.UserID = '" + Request["UserID"] + "' and 
    SectionAccess.Link=AdminConsole.Link); 
+0

Dies hat den Trick. Vielen Dank! –

0

Versuchen Sie die Verbindung in der Unterabfrage auszulassen:

SELECT Link, PPMID, EPRID, Proj_Name FROM AdminConsole 
WHERE Link NOT IN 
(SELECT SectionAccess.Link FROM SectionAccess 
WHERE SectionAccess.UserID = '" + Request["UserID"] + "'); 
0

existiert nicht NULL zurückgeben kann. Es überprüft nur das Vorhandensein oder Fehlen einer Zeile in der Unterabfrage und kann daher nur wahr oder falsch zurückgeben.

können Sie verwenden AUSSER

SELECT SectionAccess.Link, SectionAccess.UserID, AdminConsole.PPMID, AdminConsole.EPRID, AdminConsole.Proj_Name VON SectionAccess INNER JOIN Adminconsole ON SectionAccess.Link = AdminConsole.Link

AUSSER

SELECT SectionAccess.Link, SectionAccess.UserID, AdminConsole.PPMID, AdminConsole.EPRID, AdminConsole.Proj_Name FROM SectionAccess INNER JOIN Adminconsole SectionAccess.Link ON = AdminConsole.Link WHERE SectionAccess.UserID wie ('% "+ Anfrage [" UserID "] +"%');

Verwandte Themen