【问题标题】:SQL Join a row table with a column tableSQL 将行表与列表连接起来
【发布时间】:2021-02-10 19:53:01
【问题描述】:

我有两个表正在尝试连接(加入)。 Table1是一个列表,如下:

id Phone Name Description
101 123456 Maria Abc
102 234567 Daniel Def

表2为行表如下:

id Attribute Value
101 Manager Rudolf
101 Account 456
101 Code B
102 Manager Anna
102 Code B
102 Code C

我要找的结果是:

id Phone Name Description Manager Account Code
101 123456 Maria Abc Rudolf 456 B
102 234567 Daniel Def Anna B,C

【问题讨论】:

  • 欢迎来到 SO!感谢 Gordon 的表格格式。您是否已经尝试过任何东西,然后edit 并发布您的minimal reproducible example,请。它将帮助我们发现您的问题并提供帮助!
  • 我忘了! Code 属性是一个多行行值,我想用逗号分隔。对不起!
  • 也许给你的tables起有意义的名字会有所帮助(例如table2employee)。然后您可以描述他们与我们的关系:见ER model

标签: sql join row


【解决方案1】:

您可以三次加入同一个表(使用不同的别名)。例如:

select
  p.*,
  a.value as Manager,
  b.value as Account,
  c.value as Cardno
from table1 p
left join table2 a on a.id = p.id and a.attribute = 'Manager'
left join table2 b on b.id = p.id and b.attribute = 'Account'
left join table2 c on c.id = p.id and b.attribute = 'Cardno'

【讨论】:

  • 完美运行。非常感谢!
  • select * from ( select distinct t1.id,t1.attribute, STUFF( (SELECT ', ' + convert(varchar(10), t2.value, 120) FROM table1 t2 where t1.id = t2.id 和 t1.attribute=t2.attribute FOR XML PATH ('')) , 1, 1, '') 表 1 中的 AS 值 t1 ) d pivot ( max(value) 用于 (manager,account,cardno) 中的属性,code) ) piv
  • @Mikael 如果这是您尝试过的 SQL 代码,那就完美了!将其添加到您的问题中,并简要说明需要改进的地方?
【解决方案2】:

如果您的“行表”中只有三个唯一属性,则可以使用这样的子查询:

SELECT 
t.*,
(SELECT t2.Value FROM Table2 WHERE t2.id = t1.id AND t2.Attribute='Manager') as Manager,
(SELECT t2.Value FROM Table2 WHERE t2.id = t1.id AND t2.Attribute='Account') as Account, 
(SELECT t2.Value FROM Table2 WHERE t2.id = t1.id AND t2.Attribute='Cardno') as Cardno,
FROM Table1 t

如果你有更多独特的属性那么你应该尝试viewsstored procedure和临时表来生成你想要的表

【讨论】:

  • 子查询 会起作用。尽管在实践中 SELECT 语句通过使用 JOIN 变得更易于阅读和维护。通常,在这种情况下,JOIN 可以提高性能?
【解决方案3】:

您应该使用 3 次表 2 来获取经理内部的 3 个属性(始终匹配)和 Account 和 CardNo 的左连接(不总是匹配)

select a.id, a.phone, a.Name, a.Description b.value, c.value
from table1 a 
inner join table2 b ON a.id = b.id and b.attribute = 'Manager' 
left  join table2 c ON a.id = c.id and c.attribute = 'Account' 
left join table2 d ON a.id = d.id and d.attribute = 'CardNo' 

【讨论】:

  • SELECT 列表中的语法错误和 INNER JOIN 的“no boss”限制是否具有教学目的? ?
猜你喜欢
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 2015-02-20
  • 2011-02-05
  • 2013-07-08
  • 2011-07-25
相关资源
最近更新 更多