【问题标题】:T-SQL: Joining result-sets horizontallyT-SQL:水平连接结果集
【发布时间】:2013-05-29 18:08:08
【问题描述】:

我有两个表,每个表都将自己的结果集作为一行生成。我想将这些结果集加入一行。例如:

SELECT *
FROM Table 1
WHERE Year = 2012 AND Quarter = 1

结果:

Year  Quarter  Name  State  Mail
2012  1        Bob   NY     bob@gmail

查询 #2:

SELECT *
FROM Table 2
WHERE Year = 2012 AND Quarter = 1

结果:

Year  Quarter  Name  State  Mail
2012  1        Greg  DC     greg@gmail

所需的结果集:

SELECT *
FROM Table 3
WHERE Year = 2012 AND Quarter = 1

Year  Quarter  T1Name  T1State  T1Mail     T2Name  T2State  T2Mail
2012  1        Bob     NY       bob@gmail  Greg    DC       greg@gmail

结果被连接/透视到年份和季度的组合上,这将通过参数输入到查询中。任何帮助将不胜感激。提前致谢!

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

除非我遗漏了什么,看起来你可以加入year/quarter 上的表格,似乎不需要旋转数据:

select t1.year, 
  t1.quarter,
  t1.name t1Name,
  t1.state t1State,
  t1.mail t1Mail,
  t2.name t2Name,
  t2.state t2State,
  t2.mail t2Mail
from table1 t1
inner join table2 t2
  on t1.year = t2.year
  and t1.quarter = t2.quarter
where t1.year = 2012
  and t1.quarter = 1;

SQL Fiddle with Demo

现在,如果对两个表中是否存在yearquarter 存在疑问,那么您可以使用FULL OUTER JOIN

select coalesce(t1.year, t2.year) year, 
  coalesce(t1.quarter, t2.quarter) quarter,
  t1.name t1Name,
  t1.state t1State,
  t1.mail t1Mail,
  t2.name t2Name,
  t2.state t2State,
  t2.mail t2Mail
from table1 t1
full outer join table2 t2
  on t1.year = t2.year
  and t1.quarter = t2.quarter
where (t1.year = 2012 and t1.quarter = 2)
  or  (t2.year = 2012 and t2.quarter = 2)

SQL Fiddle with Demo

【讨论】:

  • 只有一个后续问题...有没有办法在使用 SELECT * 时为特定表中的所有列设置别名?我想我需要进行大量手动别名,因为每个表确实有超过 25 列
  • @ThoughtExperiment 不幸的是,没有简单的方法可以为列添加别名。
【解决方案2】:

您需要做的就是确定连接条件,即必须在两个表中具有匹配值的列。在您的情况下,它看起来是年和季度
所以你会写类似 select * from Table_1 A Join Table_2 B ON A.year=B.year and A.quarter=B.quarter

【讨论】:

    【解决方案3】:

    如果您有两个查询返回一行,您可以使用cross join 将它们放在一个结果行中:

    select t1.Year, t1.Quarter, T1.Name, T1.State, T1.Mail, T2.Name, T2.State, T2.Mail
    from (SELECT *
          FROM Table 1
          WHERE Year = 2012 AND Quarter = 1
         ) t1 cross join
         (SELECT *
          FROM Table 2
          WHERE Year = 2012 AND Quarter = 1
         ) t2
    

    如果您希望它们位于不同的行中,则使用union all(假设它们在相同位置具有相同的列)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多