我是mssql的新手。这里试图通过连接三个表从数据库中获取值。
表1:
表2:
在此图像中,单个用户有可能具有多个图像ID ,因为我需要拍摄其中一张图像。
表3:
这里使用 H_ID 加入表1和表2 以及使用 IMG_ID
的表2和表3。我要做的是需要从表1和表2中获取所有列值,但要从表3中获得第一个URL。
在这种情况下,一个员工在表中有多个图像,我需要使用1个URL。
结果应如下所示:
查询:
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'
现在,此查询返回ID为H_ID = 1001的3行,但应为单行。
谁能帮我解决这个问题。
答案 0 :(得分:2)
使用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'
答案 1 :(得分:0)
我认为,您可以简单地使用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'