【问题标题】:join two lists with columns showing values from each table without duplicates加入两个列表,其中的列显示每个表中的值且不重复
【发布时间】:2018-01-25 04:24:51
【问题描述】:

我有两张桌子。每个表有两列。每个表的第一列是匹配/映射列。我不知道如何解释我要做什么,所以我将使用一个示例。

表 1

| col1 | col2  |
|------|-------|
| a    | one   |
| a    | two   |
| b    | three |
| c    | four  |

表 2

| col1 | col2  |
|------|-------|
| a    | five  |
| b    | six   |
| b    | seven |
| d    | eight |

想要的输出

| col1 | table1 | table2 |
|------|--------|--------|
| a    | one    | five   |
| a    | two    |        |
| b    | three  | six    |
| b    |        | seven  |
| c    | four   |        |
| d    |        | eight  |

(空单元格为空)

基本上,我正在寻找一个汇总表,其中显示每个表中col1 的所有col2 选项。我希望这是有道理的......

【问题讨论】:

  • 为什么五个只匹配一个(而不是两个)?同样,为什么三匹配六(而不是七)?
  • 因为我并没有真正尝试加入。我正在加入col1,但我只是想了解每个表的摘要。

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

你需要FULL OUTER JOINROW_NUMBER

SELECT COALESCE(a.col1, b.col2),
       COALESCE(a.col2, ''),
       COALESCE(b.col, '')
FROM   (SELECT *,
               Rn = Row_number()OVER(partition BY col1 ORDER BY @@SPID)
        FROM   table1) a
       FULL JOIN (SELECT *,
                         Rn = Row_number()OVER(partition BY col1 ORDER BY @@SPID)
                  FROM   table2) b
              ON a.col1 = b.col1
                 AND a.Rn = b.Rn 

【讨论】:

  • 正在等待我的计算机重新启动以便我可以进行测试,但为什么要使用 @@SPID
  • @IMTheNachoMan 您也可以通过col2订购
  • @IMTheNachoMan 因为在您的情况下不需要正确的排序,我只想要一个常量值来按顺序使用它。它可以是我刚刚使用的任何东西@@SPID。你也可以用这个(select NULL)
  • 干得好!比我最初的想法优雅得多。还挖掘了值得+2的@@SPID
  • @JohnCappelletti - 谢谢.. 如果想出一个 xml 解决方案,我不会感到惊讶 ;)
猜你喜欢
  • 2022-12-24
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多