2017-06-29 16 views
1

Was sollte der beste Ansatz sein, um eine Liste von Produkten entweder mit Standardwerten oder benutzerdefinierten Benutzerwerten zurückzugeben? Beispiel:LINKE VERBINDUNG auf zwei oder mehr Tabellen

Produkte

product_id name    category 
--------------------------------------- 
PROD1  SM-W620NZKBDBT 2 
SOFT1  MS-UIOA2189090 2 
SOFT2  LE-UIOSAI91000 2 

Einstellungen (Standardeinstellungen, das kann von jedem Benutzer verwendet werden - user_id ist nulll)

product_id title   color user_id 
---------------------------------------------- 
PROD1  Samsung   black NULL 
SOFT1  MS Office-365 NULL  NULL 

Einstellungen (benutzerspezifischen Einstellungen, auf den Standardeinstellung gebaut)

* Benutzereinstellungen voraussichtlich in der gleichen Tabelle, wenn möglich

Erwartete Ausgabe der Produktliste für Benutzer mit user_id = 123 und Kategorie = 2

product_id title   color  
-------------------------------------- 
PROD1  Samsung/WIFI dark  <- product with user settings 
SOFT1  MS Office-365 NULL  <- product with default settings 
SOFT2  LE-UIOSAI91000 NULL  <- product without settings 

Produktliste und Einstellungen haben nur sehr wenige Elemente und eine begrenzte Nutzung.

+0

Was haben Sie versucht? Zeigen Sie uns Ihren aktuellen Anfrageversuch. – jarlh

+0

sagen zum Beispiel, ist benutzerspezifische Einstellungen Tabelle hat mehrere Einträge für ein bestimmtes Produkt dann, wie Ihre Ergebnismenge sollte? –

Antwort

1
SELECT TOP (1) WITH TIES 
    * 
FROM products  P 
LEFT JOIN settings S ON S.product_id = P.product_id AND (S.user_id = @user_id OR S.user_id IS NULL) 
ORDER BY ROW_NUMBER() OVER(PARTITION BY P.product_id ORDER BY S.user_id DESC) 
+0

Haben Sie die erwartete Wiederherstellung gesehen? – Sami

+0

@Sami nein, da keine 'products' und' settings' Tabellen in meinem DB –

0
CREATE TABLE #Table1 
    ([product_id] varchar(5), [name] varchar(14), [category] int) 
; 

INSERT INTO #Table1 
    ([product_id], [name], [category]) 
VALUES 
    ('PROD1', 'SM-W620NZKBDBT', 2), 
    ('SOFT1', 'MS-UIOA2189090', 2), 
    ('SOFT2', 'LE-UIOSAI91000', 2) 
; 
CREATE TABLE #Table2 
    ([product_id] varchar(5), [title] varchar(13), [color] varchar(5), [user_id] varchar(4)) 
; 

INSERT INTO #Table2 
    ([product_id], [title], [color], [user_id]) 
VALUES 
    ('PROD1', 'Samsung', 'black', NULL), 
    ('SOFT1', 'MS Office-365', NULL, NULL) 

CREATE TABLE #Table3 
    ([product_id] varchar(5), [title] varchar(13), [color] varchar(4), [user_id] int) 
; 

INSERT INTO #Table3 
    ([product_id], [title], [color], [user_id]) 
VALUES 
    ('PROD1', 'Samsung/WIFI', 'dark', 123), 
    ('SOFT3', 'MS Windows 10', 'N/A', 123) 

SELECT 
A.PRODUCT_ID,ISNULL(B.TITLE,A.NAME) TITLE,B.COLOR 
FROM #TABLE1 A LEFT JOIN 
#TABLE3 B ON A.PRODUCT_ID=B.PRODUCT_ID 
AND USER_ID = 123 
ORDER BY user_id DESC 
0

Try this:

Declare @Products Table (product_id varchar(25) , name varchar(50) , category int); 
Declare @Settings Table (product_id varchar(25) , title varchar(50) , color varchar(25) , user_id int); 

Insert into @Products values 
('PROD1' , 'SM-W620NZKBDBT' , 2) , 
('SOFT1' , 'MS-UIOA2189090' , 2) , 
('SOFT2' , 'LE-UIOSAI91000' , 2) ; 

Insert into @Settings values 
('PROD1' , 'Samsung' , 'black' , Null), 
('SOFT1' , 'MS Office-365' , Null , Null), 
('PROD1' , 'Samsung/WIFI' , 'Dark' , 123), 
('SOFT3' , 'MS Windows 10' , 'N/A' , 123); 


SELECT A.product_id product_id , 
     coalesce(A.Name,B.title) Tile, 
     B.Color 
From @Products A Left join @Settings B ON A.product_id = B.product_id and USER_ID = 123; 

Demo.

+0

Ihre Abfrage liefert ein falsches Ergebnis. Testen Sie mit diesen Daten in 'Einstellungen':' ('SOFT1', 'MS Office-365', 'Grau', Null) '(Farbe sollte Grau sein) –

+0

@MikhailLobanov Nein, du irrst, er sagte user_id = 123, so Es wird '('SOFT1', 'MS Office-365', 'Grey', 123)' – Sami

+0

Wenn für bestimmte Benutzer und Produkte keine Einstellung vorhanden ist, sollte die Standardeinstellung verwendet werden –