【问题标题】:Fetch single row from two rows of a table with join in SQL Server在 SQL Server 中使用联接从表的两行中获取单行
【发布时间】:2018-02-08 06:53:00
【问题描述】:

我需要使用 Join 或其他方式从表中的两行中提取一行。我有三个表 Account、Account_Perm 和 User。 Account 表有一个名为 AccountNum 的字段,Account_Perm 有 AccountNum、TeamRole 和 UserName 的字段,User 表有用户名。示例数据如下。

  • Account ==> AccountNum = 1234, 5678
  • Account_Perm ==> AccountNum = 1234,TeamRole=TeamA; AccountNum = 1234,TeamRole=TeamB
  • 用户 ==> TeamRole=TeamA,用户名=John Smith; TeamRole=TeamB, UserName = "Casey Brown"。

我需要使用这些表格,我的结果集与列(AccountNum、TeamRole、TeamRole)应如下所示。

1234, John Smith, Casey Brown

通过使用 Join,我可以获得两行,分别为 1234,John Smith 和 1234,Casey Brown。但是,我需要单个记录中的 AccountNum、TeamA 的用户名和 TeamB 的用户名。

有人可以帮忙吗?

查询:

SELECT
    A.AccountNum,
    A.TeamRole,
    U.Name
FROM 
    Account A,
    Account_Perm AA,
    User U
WHERE 
    A.AccountNum = AA.AccountNum
    AND AA.TeamRole IN ('TeamA', 'TeamB')
    AND AA.UserName = U.Name;

【问题讨论】:

  • By using Join ...请包括您当前的查询。您的数据很难阅读和理解。

  • Select A.AccountNum, A.TeamRole, U.Name from Account A, Account_Perm AA, User U WHERE A.AccountNum = AA.AccountNum AND AA.TeamRole IN ('TeamA' , 'TeamB') AND AA.UserName = U.Name
  • 您的数据和问题不清楚,我什至无法猜测答案。执行以下操作:编辑您的问题以表格格式显示示例数据,就像 SQL 查询将返回一样,然后 2) 显示包含所需结果的示例输出表。你应该意识到,如果你一开始就这样做了,你可能已经有了答案。
  • 该查询不会得到您预期的结果。您想要两个用户名,但正在查询用户名和团队角色?
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 年前!),不鼓励使用它

标签: sql-server join


【解决方案1】:
declare @Account table( AccountNum int);
insert into @Account values (1234), (5678);

declare @Account_Perm table ( AccountNum int, TeamRole varchar(100))
insert into @Account_Perm values( 1234, 'TeamA'), (1234, 'TeamB');

declare @User table (TeamRole varchar(100), UserName varchar(100));
insert into @User values ('TeamA', 'John Smith'), ('TeamB','Casey Brown');

--AccountNum, TeamRole, TeamRole) should be as below.
--1234, John Smith, Casey Brown
with cte AS
(
SELECT 
    A.AccountNum,
    AA.TeamRole,
    U.UserName
FROM 
    @Account A join @Account_Perm AA
       on A.AccountNum = AA.AccountNum
    join @User U
       on AA.TeamRole = U.TeamRole
WHERE  AA.TeamRole IN ('TeamA', 'TeamB')
)

select *
from cte pivot(max(UserName) for TeamRole in ([TeamA], [TeamB]))p   

【讨论】:

  • 您的解决方案似乎效果很好。谢谢你的帮助。一件小事。当帐户的 TeamA 没有行时,对应于 TeamA 的用户名填充为 NULL。有没有办法让它空白?
  • 没关系。我通过将 ISNULL 子句添加到选择中来使其工作。
猜你喜欢
  • 2015-07-20
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多