Как получить значение первой строки из третьей таблицы при объединении трех таблиц - PullRequest
1 голос
/ 19 марта 2019

Я новичок в mssql. Здесь я пытаюсь получить значения из базы данных, объединив три таблицы.

Таблица 1:

enter image description here

Таблица 2:

enter image description here

Здесь у изображения есть возможность, что один пользователь может иметь несколько идентификаторов изображений , для этого мне нужно взять любое изображение.

Таблица 3:

enter image description here

Здесь я присоединяюсь к Таблице 1 и Таблице 2, используя H_ID и Таблицу 2 и Таблицу 3, используя IMG_ID.

Я хочу получить все значения столбцов из Таблицы 1 и Таблицы 2, но первый URL из Таблицы 3.

В этом случае у сотрудника есть несколько изображений в таблице, мне нужно взять 1 URL.

Результат должен быть таким:

enter image description here

Запрос:

SELECT T1.H_ID AS 'ID',
       T1.NAME,
       T1.ROLE,
       T2.SALARY,
       T3.IMAGE 
FROM TABLE1 T1 

JOIN TABLE2 T2 
ON T1.H_ID T2.H_ID  

JOIN TABLE3 T3 
ON T3.IMG_ID = T2.IMG_ID 

WHERE T1.STATUS = 'ACTIVE'

Теперь этот запрос возвращает 3 строки для идентификатора H_ID = 1001, но это должна быть одна строка.

Может кто-нибудь помочь мне исправить это.

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

использование row_number()

with cte as

(SELECT T1.H_ID AS 'ID',T1.NAME,T1.ROLE,T2.SALARY,T3.IMAGE 
,row_number() over(partition by T2.img_id order by T3.id) rn
FROM TABLE1 T1 

JOIN TABLE2 T2 
ON T1.H_ID T2.H_ID  

JOIN TABLE3 T3 
ON T3.IMG_ID = T2.IMG_ID WHERE T1.STATUS = 'ACTIVE'

) select * from cte where rn=1

После ваших комментариев кажется, что вам нужен подзапрос

select T1.*,T2.sal,a.url
    FROM TABLE1 T1     
    JOIN TABLE2 T2 
    ON T1.H_ID T2.H_ID
    left join ( select min(id),img_id,url from table3 group by img_id,url) a
    on T2.IMG_ID= a.img_id
  WHERE T1.STATUS = 'ACTIVE'
0 голосов
/ 19 марта 2019

Я думаю, вы можете просто использовать OUTER APPLY и TOP 1 для этого

SELECT T1.H_ID AS 'ID',
       T1.NAME,
       T1.ROLE,
       T2.SALARY,
       T3.IMAGE 
FROM TABLE1 T1 
JOIN TABLE2 T2 ON T1.H_ID T2.H_ID  
OUTER APPLY(SELECT TOP 1 T3.IMAGE 
            FROM TABLE3 T3 WHERE T3.IMG_ID = T2.IMG_ID 
            --ORDER BY <column_name> --to take top 1 value in specific order
            ) T3        
WHERE T1.STATUS = 'ACTIVE'
...