2016-08-08 27 views
0

ich SQL Server bin mit 2014 Ich habe folgende Tabelle mit dem Namen: DATE_PARAM:Return Reihen mit userId null oder ohne Gruppe basiert von

ID FROM_VALUE  TO_VALUE     PARAM_NAME  USER_ID 
------------------------------------------------------------------------ 
1 2016-01-01  2017-01-01 00:00:00.000  date   NULL 
2 2016-02-01  2017-01-01 00:00:00.000  date   -1 
3 2016-02-01  2018-02-01 00:00:00.000  anotherDate  NULL 
4 2016-04-01  2018-02-01 00:00:00.000  anotherDate  3 

Diese Tabelle listet alle verfügbaren Parameter. PARAM_NAME ist der Name des Parameters und ist für jeden Parameter eindeutig. USER_ID == NULL bedeutet, dass dies ein vom Administrator definiertes Attribut ist. USER_ID == Eine beliebige Zahl bedeutet, dass dieser Parameter dem Benutzer gehört.

Was möchte ich zum Beispiel für Parameter erreichen: userId=-1 - Zuerst gruppiere ich diese Datensätze von PARAM_NAME. Dann möchte ich in der ersten Priorität das Attribut erhalten, das ihm gehört (USER_ID=-1), aber wenn es kein Attribut gibt, das ihm gehört (innerhalb desselben PARAM_NAME), würde ich gerne vom Administrator USER_ID=null zur Verfügung gestellt bekommen.

Erwartetes Ergebnis:

ID FROM_VALUE  TO_VALUE     PARAM_NAME  USER_ID 
----------------------------------------------------------------------- 
2 2016-02-01  2017-01-01 00:00:00.000  date   -1 
3 2016-02-01  2018-02-01 00:00:00.000  anotherDate  NULL 

Ich bin nicht sicher, ob es durch Abfrage realisiert werden kann und selbst wenn ja, ob es wird in der Leistung gut sein. Ich habe versucht, einen selbst linken Outer Join zu machen, habe aber immer noch kein erwartetes Ergebnis.

EDIT - ANTWORT

select distinct 
    isnull(users.from_value,admin.from_value) from_, 
    isnull(users.to_value,admin.to_value) to_, 
    param_list.param_name PARAM_NAME, 
    users.user_id USER_ID 
from 
    (Select param_name from DATE_PARAM) param_list 
left join 
    (select * from DATE_PARAM where user_Id = -1) users on users.param_name = param_list.param_name 
left join 
    (select * from DATE_PARAM where user_id is null) admin on admin.param_name = param_list.param_name; 
+0

Try this: SELECT * FROM Tabellenname WHERE BENUTZER_ID = -1 UNION ALL SELECT * FROM Tabellenname WHERE USER_ID IST NULL –

+0

Zunächst ist die Tabelle keine Liste von Parametern, es gibt mehrere Zeilen in der Tabelle sowohl für Parameter "Datum" als auch für Parameter "AnderesDatum". Es sieht so aus, als ob es sich um eine Tabelle von Zeiträumen (Datumsbereichen) handeln könnte, wenn ein Parameter mit einem bestimmten Benutzer verknüpft (verknüpft mit?) Wäre. Definieren Sie das Schema besser oder deutlicher bitte. –

+0

Fügen Sie dem @MaciejLos-Kommentar eine Klausel 'GROUP BY [PARAM_NAME]' hinzu, und Sie sollten in Ordnung sein. –

Antwort

1
Select param_name from parameters 

Above Anweisung vorausgesetzt, dass Sie eine Parametertabelle, die einfach eine Liste aller Parameter. Dadurch wird die Liste aller Parameter erstellt, die Sie als Basis verwenden können. Wir gehen dann nach links, verbinden uns zweimal mit dieser Tabelle, einmal für die Benutzer-ID und einmal für die Null-Zeilen.

... 
from (Select param_name from parameters) PARAM_LIST 
left join (select * from tbl where user_Id = -1) users 
    on users.param_name = param_list.param_name 
left join (select * from tbl where user_id is null) admin 
    on admin.param_name = param_list.param_name 

Dies gibt Ihnen jetzt eine Zeile für jeden Parameter und den Benutzerwert und den Admin-Wert. Jetzt ist es eine Frage der Verwendung von isnull's in Ihrer Select-Anweisung, um die richtige zu finden.

select isnull(users.from_value,admin.from_value), 
     isnull(users.to_value,admin.to_value), 
     param_list.param_name, 
     isnull(users.user_id,'admin') 

es alle zusammen

select isnull(users.from_value,admin.from_value), 
     isnull(users.to_value,admin.to_value), 
     param_list.param_name, 
     isnull(users.user_id,'admin') 
from (Select param_name from parameters) PARAM_LIST 
left join (select * from tbl where user_Id = -1) users 
    on users.param_name = param_list.param_name 
left join (select * from tbl where user_id is null) admin 
    on admin.param_name = param_list.param_name 

bearbeiten ... Sqlserver ist isnull nicht IFNULL ... Ich denke,

+0

Können Sie mir bitte sagen, was bedeutet Benutzer in Ihrem Fall? Ist es ein Alias?Problem das ich habe "tbl" und "Parameter" in meinen Tabellennamen geändert: DATE_PARAM, aber es kompiliert nicht unter "user" und "admin". – Gazeciarz

+0

ehrlich gesagt, ich hätte das Wort user nicht verwenden sollen, da es ein reserviertes Wort ist. Benutzer und Admin sind in diesem Fall die Aliasnamen der Unterabfragen. Sie müssen das Konzept für die Unterabfrage kennen. https://technet.microsoft.com/en-us/library/ms190410(v=sql.105).aspx – Twelfth

+0

Schön !! Es funktioniert wie erwartet !! Ich habe gerade "admin" bearbeitet, nur um users.user_id zurückzugeben und habe eine Unterscheidung zur Root-Abfrage getroffen. Vielen Dank! – Gazeciarz