Sql 两个或多个表上的左联接

Sql 两个或多个表上的左联接,sql,sql-server,Sql,Sql Server,返回具有默认值或自定义用户值的产品列表的最佳方法是什么?例如: 产品 product_id name category --------------------------------------- PROD1 SM-W620NZKBDBT 2 SOFT1 MS-UIOA2189090 2 SOFT2 LE-UIOSAI91000 2 设置(默认设置,可由任何用户使用-用户id为空) 设置(用户特定设置

返回具有默认值或自定义用户值的产品列表的最佳方法是什么?例如:

产品

product_id   name              category
---------------------------------------
PROD1        SM-W620NZKBDBT    2 
SOFT1        MS-UIOA2189090    2
SOFT2        LE-UIOSAI91000    2
设置(默认设置,可由任何用户使用-用户id为空)

设置(用户特定设置,建立在默认设置之上)

*如果可能,用户设置应在同一个表中

用户id为123且类别为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
产品标识标题颜色
-------------------------------------- 
PROD1三星/WIFI暗试试以下方法:

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;

.

你试过什么?向我们显示您当前的查询尝试。例如,特定于用户的设置表是否具有特定产品的多个条目,然后您的结果集应该是什么样子?您是否看到预期的结果?@Sami否,我的数据库中没有
产品
设置
表您的查询返回错误的结果。在
设置中使用此数据进行测试
('SOFT1','msoffice-365','Gray',Null)
(颜色应为灰色)@MikhailLobanov不,你错了,他说用户id=123,所以它将
('SOFT1','msoffice-365','Gray',123)
如果没有针对特定用户和产品的设置,则应使用默认设置
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
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)
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
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;