Sql 左联接,不包含右表中的多行

Sql 左联接,不包含右表中的多行,sql,sql-server,teradata,Sql,Sql Server,Teradata,我有两个表(User和Salary)。我想从User到Salary进行左连接。对于每个用户,我想要他们的姓名和薪水。如果他们没有工资,该字段可以留空。到目前为止,我们只需要一个左连接。但我只希望每个用户有一行。由于某些缺陷,一个用户可以有多个工资(参见表salary)。我只希望每个用户有一行可以随机选择(或前1名)。我该怎么做?预期输出显示在底部 用户表: User Name 1 Adam 2 Al 3 Fred 工资表 User Salary 1 1000 2

我有两个表(
User
Salary
)。我想从
User
Salary
进行
左连接。对于每个用户,我想要他们的姓名和薪水。如果他们没有工资,该字段可以留空。到目前为止,我们只需要一个左连接。但我只希望每个用户有一行。由于某些缺陷,一个用户可以有多个工资(参见表salary)。我只希望每个用户有一行可以随机选择(或前1名)。我该怎么做?预期输出显示在底部

用户表:

User Name
1    Adam
2    Al
3    Fred
工资表

User  Salary
1     1000
2     2000
2     2000
预期表格:

User Name  Salary
1    Adam  1000
2    Al    2000 
3    Fred  null
试试这个:

select U.User, U.Name, min(S.Salary)
from UserTable U
left join SalaryTable S on S.User = U.User
group by U.User, U.Name
试试这个

 select distinct U.User, U.Name, S.Salary
 from UserTable U
 left join SalaryTable S on S.User = U.User

User
更改为
Userid
,因为
User
是SQL中的保留字

SELECT u.Userid, u.Name, MAX(S.Salary)
FROM Usertable u
LEFT JOIN Salarytable s ON u.Userid = s.userid
GROUP BY u.userid, u.name

SQL FIDLE:

使用派生表从工资表中获取不同的行

select u.userid, u.username, s.salary
from users u left join (select distinct userid, salary from salaries) s
  on u.userid = s.userid
此外,还重命名了表和列。表名通常应以s结尾(因为多元论)。列不应以s结尾

或者,按
分组:

select u.userid, u.username, max(s.salary)
from users u left join salaries s
  on u.userid = s.userid
group by u.userid, u.username
或跳过左侧联接,改为执行相关子查询:

select u.userid, u.username, (select max(s.salary) from salaries s
                              where u.userid = s.userid)
from users

您可以利用行号获得最高(或最低)工资:

在Teradata中,您可以在派生表中使用QUICITE应用
rn=1
过滤器:

SELECT *
FROM Usertable u
LEFT JOIN
 (
   select Userid, Salary,
      row_number() 
      over (partition by Userid
            order by Salary desc) as rn
   from Salarytable
   qualify rn = 1
 ) as s 
ON u.Userid = s.userid

当您在薪资表中有多个重复用户时,是否有不同的薪资附加到他们?为什么您允许在薪资表中为用户重复行???也许应该是max(S.salary)@PSVSupporter OP'S不关心:)谢谢您的SQL FIDLE。这正是我想要的。很抱歉评论一个旧的答案。你知道这3个查询中哪一个对性能的影响较小吗?@AJPerez,我对SQL Server不太了解,所以这只是一个猜测,最好自己试试看。
SELECT *
FROM Usertable u
LEFT JOIN
 (
   select Userid, Salary,
      row_number() 
      over (partition by Userid
            order by Salary desc) as rn
   from Salarytable
   qualify rn = 1
 ) as s 
ON u.Userid = s.userid