左连接没有来自右侧的多行 table
Left join without multiple rows from right table
我有两个 table(User
和 Salary
)。我想做一个从 User
到 Salary
的 left 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
我有两个 table(User
和 Salary
)。我想做一个从 User
到 Salary
的 left 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