2012-04-10 5 views
0

Ich habe zwei Tabellen hat man einen Satz von IDs und der andere hat eine Reihe von IDs und eine Benutzer-ID alsDer beste Weg, in dieser Abfrage mit dem gewünschten Ergebnis zu kommen

Kunde

folgt
 id 
    ----- 
    3 
    4 
    6 
    7 
    9 
    11 

Geschäft

ClientId |  userId 
---------------------- 
4   2 
4   3 
9   2 

Also im Grunde werde ich einen Parameter haben in @userId kommen und wenn die @use rId = 2 zum Beispiel, dann hat dieser Benutzer Zugriff auf clientId 4 und 9 und alle anderen in der ClientId-Tabelle, aber wenn er @userId = 5 ist, kann dieser Benutzer nicht auf die Client-IDs 4 und 9 zugreifen, da sie in der Business-Tabelle eingeschränkt sind nur Kunden 2 und 3.

Mein Wunschergebnis ist eine Liste aller Client-IDs, die ein Benutzer sehen kann (aber muss prüfen, ob eine Benutzer-ID in der Business-Tabelle angegeben ist und die Benutzer-ID nicht dort ist.) Diese Benutzer-ID kann die Client-IDs in der Business-Tabelle beim Abfragen der Client-Tabelle nicht sehen.

Es tut mir leid, es ist so verwirrend .. ich habe eine harte Zeit mit diesem zu kommen .. Alle Zeiger würden sehr geschätzt werden.

sollte das Ergebnis sein

Angenommen, Benutzer-ID = 2

id 
--- 
3 
4 
6 
7 
9 
11 

Angenommen User ID = 13

id 
--- 
3 
6 
7 
11 

Weil 4 und 9 für die Benutzer beschränkt sind 2 bzw. 3 .

+1

Nur um zu klären - wenn userId 5 an, so sollte sie in der Lage sein clientIds zu sehen, 3, 6, 7 und 11? –

+0

Wow - diese Frage macht keinen Sinn. Stellen Sie mehr Daten zur Verfügung, um zu veranschaulichen, was Sie tun möchten – Bohemian

+0

Hmmm - bei meinem nächsten Re-Read, es klingt so lange wie sie in der Business-Tabelle sind, es spielt keine Rolle, mit welcher ClientID sie verbunden sind, sie bekommen * * all ** Clients: * "Wenn beispielsweise @userId = 2 ist, dann hat dieser Benutzer Zugriff auf clientId 4 und 9 ** und alle anderen ** in der ClientId-Tabelle" * Bearbeiten meiner Antwort, um dies zu berücksichtigen. –

Antwort

1

Edit: basierend auf meiner neu gelesen, mein Verständnis der Logik ist das: zurück alle Clients, wenn die UserID in der Business-Tabelle ist, alle Clients, die nicht in der Business-Tabelle vorhanden sind andernfalls.

IF EXISTS (SELECT ClientId FROM Business WHERE UserId = @userId) 
BEGIN 
    SELECT DISTINCT Id 
    FROM Client 
END 
ELSE 
BEGIN 
    SELECT Id 
    FROM Client 
    WHERE Id NOT IN 
    (
    SELECT DISTINCT ClientId 
    FROM Business 
) 
END 
1
select DISTINCT ID from Client C 
left join Business B on C.ID = B.ClientID 
Where B.ClientID is null OR B.UserID = @UserID 
+0

Ich denke, das ist eine bessere Lösung als das, was ich gerade gepostet habe. Es ist einfacher und wird wahrscheinlich auch eine bessere Leistung haben. Gute Arbeit @amit_g –

0

Ich glaube, das die Abfrage, die Sie basiert auf meiner Interpretation Ihrer Frage wollen.

Hier ist die einfache englische Beschreibung der Abfrage: Entfernen Sie aus der Liste aller Clients die Clients, die durch die Business-Tabelle eingeschränkt sind. Fügen Sie dann die Liste der Clients hinzu, auf die der Benutzer explizit Zugriff hat.

declare @userid int =5 
(
select Id from Client 
except 
select clientId from Business 
) 
union 
select clientId from Business where userId = @userId 
Verwandte Themen