LEFT JOIN на двух или более таблицах

Каким должен быть наилучший подход для возврата списка продуктов с значениями по умолчанию или пользовательскими значениями пользователя? Пример:

Продукты

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

Настройки (настройки по умолчанию, которые могут использоваться любым пользователем – user_id, равны nulll)

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

Настройки (пользовательские настройки, созданные поверх настроек по умолчанию)

 product_id title color user_id ---------------------------------------------- PROD1 Samsung/WIFI dark 123 SOFT3 MS Windows 10 N/A 123 

* Пользовательские настройки, как ожидается, будут в одной и той же таблице, если возможно

Ожидаемый выпуск списка продуктов для пользователя с user_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 

В списке продуктов и настройках будет очень мало элементов и ограниченное использование.

 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; 

Демо .

Interesting Posts

Hibernate не может создать экземпляр генератора id в Spring с несколькими источниками данных

Показывать только одну запись, если значение такое же в другом столбце SQL

лучший клиентский инструмент sql server и окно редактирования студий обновления?

SELECT из каталога по умолчанию связанного сервера

Вставить записи в таблицу, если она не существует, или добавить новую запись с существующей записью?

SQL Server 2005 – экспортировать таблицу программно (запустите файл .sql, чтобы перестроить его)

IF EXISTS, затем Update else ничего не делает – SQL SERVER 2012

Обновление промежуточных строк

dense_rank заполняет tempdb на сервере SQL?

Как выбрать самые последние значения?

Преобразование Entity Framework исключает столбцы таблицы базы данных

Средство просмотра данных SSIS не отображает количество строк и данные

Запрос SQL в разделительную строку в хранимой процедуре

Подсчет звонков по получасовым интервалам

Параметрирование имени базы данных в сценарии SQL

Давайте будем гением компьютера.