左连接没有来自右侧的多行 table

Left join without multiple rows from right table

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

用户Table:

User Name
1    Adam
2    Al
3    Fred

工资Table

User  Salary
1     1000
2     2000
2     2000

预计table:

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 Fiddle: http://sqlfiddle.com/#!6/ce4a8/1/0

使用派生的 table 从薪水 table 中获取不同的行。

select u.userid, u.username, s.salary
from users u left join (select distinct userid, salary from salaries) s
  on u.userid = s.userid

另外,重命名了 table 和列。 Table 名称通常应以 s 结尾(因为复数形式。)列不应该。

或者,做一个 GROUP BY:

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

您可以利用 ROW_NUMBER 获得最高(或最低)薪水:

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

在 Teradata 中,您可以在 Derived Table:

中使用 QUALIFY 应用 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