2016-04-06 12 views
2

Ich bin wahrscheinlich hier ganz dick.SQL-Abfrage: Zeilen erhalten, wo Spalten A in Tabelle A = Spalte A in Tabelle B

Ich habe ein Tabelle mit einer Liste von Reason-Codes in dem ‚Zugang‘ zu diesen Gründen wird begrenzt durch, ob oder ob nicht Spalt 1 oder 0 in.

ID | Category | Reason | Brand1 | Brand2 | Brand3 
1 | Test | That | 1 | 1 | 0 
2 | Test2 | This | 0 | 1 | 0 
3 | Test3 | Mine | 0 | 0 | 1 

Die Benutzertabelle

Username | Brand1 | Brand2 | Brand3 
    User1 | 1 | 1 | 0 

Grundsätzlich sollte User1 nur die Gründe sehen können, nach denen sie eine 1 in der Benutzer-Tabelle in den Markenspalten haben, die eine 1 in der Spalte Marke in der Begründungstabelle haben.

Benutzer1 sollte nur den Grund ID 1 & 2 sehen können, weil sie eine 1 in Brand1 und 1 in Brand2 in der Benutzertabelle haben.

Ich möchte nur die Zeilen aus der Reasons-Tabelle zurückgeben, wobei der Benutzer in der Tabelle Users eine Übereinstimmung 1 in der entsprechenden 'Marke' Spalte hat.

heißt

Benutzer 1 zurückkehren sollte

ID | Category | Reason | Brand1 | Brand2 | Brand3 
1 | Test | That | 1 | 1 | 0 
2 | Test2 | This | 0 | 1 | 0 

Wie würde ich dies in SQL, ich versuchte es mit OR ist in der WHERE-Anweisung zu schreiben, aber es war immer jede Zeile zurück. Es gibt insgesamt 7 Markenspalten.

Ich denke, ich übersehe hier etwas Einfaches aus über die Angelegenheit zu komplizieren.

Prost

+1

Bitte fügen Sie das gewünschte Ergebnis anhand Ihrer Beispieldaten hinzu. –

+3

Veröffentlichen Sie auch Ihre Aussage. Auch wenn Sie einfach jede Spalte auf Gleichheit hin vergleichen (zB 'WHERE A.Brand1 = B.Brand1 ODER A.Brand2 = B.Brand2'), sollte # 3 nicht erscheinen –

+0

Wie sieht SQL aus? –

Antwort

2

Wenn Sie Ihre SQL-Post dann könnte ich etwas näher.

Ansonsten:

SELECT * 
FROM  Reasons AS R 
INNER JOIN UserTable AS U 
    ON  (U.Brand1 = 1 AND U.Brand1 = R.Brand1) 
     OR (U.Brand2 = 1 AND U.Brand2 = R.Brand2) 
     OR (U.Brand3 = 1 AND U.Brand3 = R.Brand3); 

Dies wird nur die Zeilen, wo der Benutzer eine Marke hat, dass der Grund auch hat. Technisch könnten Sie die U.Brand# = R.Brand# in nur R.Brand# = 1 ändern, aber das könnte schwer für andere später zu lesen sein.

SELECT * 
FROM  Reasons AS R 
INNER JOIN UserTable AS U 
    ON  (U.Brand1 = 1 AND R.Brand1 = 1) 
     OR (U.Brand2 = 1 AND R.Brand2 = 1) 
     OR (U.Brand3 = 1 AND R.Brand3 = 1); 

Dies wäre wahrscheinlich schneller als die zweite Abfrage, aber nicht genug, um in den meisten Situationen zu bemerken.

2

Wenn ich richtig unter Skript versuchen zu verstehen

SELECT t.ID , t.Category , t.Reason , t.Brand1 , t.Brand2 , t.Brand3 
FROM TableName t,UserTable U 
WHERE (t.Brand1 =U.Brand1 AND t.Brand1 = 1) OR 
     (t.Brand2 = U.Brand2 AND t.Brand2 = 1) OR 
     (t.Brand3 =U.Brand3 AND t.Brand3 = 1) 
+0

Hi jaydipJ, schließen, aber es gibt alle Zeilen zurück, wobei 0 auch existiert, ich möchte nur die Zeilen, wo 1 existiert. – Lynchie

+0

@Lynchie Good Catch Aktualisiert –

1
SELECT 
    rt.* 
FROM ReasonTable AS rt 
INNER JOIN UserTable AS ut ON (rt.Id = 1 AND ut.Brand1 = 1) 
OR (rt.Id = 2 AND ut.Brand2 = 1) OR (rt.Id = 3 AND ut.Brand2 = 1) 
WHERE ut.UserId = @userId 
Verwandte Themen