拆分表并在没有公共列的情况下执行连接

Posted

技术标签:

【中文标题】拆分表并在没有公共列的情况下执行连接【英文标题】:Split the table and perform joining without common column 【发布时间】:2021-12-07 22:28:22 【问题描述】:

表格数据如下:

输入:

version value  code   type     year
PMS    0.00    01    HOURS     2006
000    312.00  01    HOURS     2006
000    0.00    04    HOURS     2006
PMS    0.00    01    NON STOCK 2006
000    835.00  01    NON STOCK 2006
000    835.00  04    NON STOCK 2006
000    0.00    04    HOURS     2007

我需要根据代码(01和04)拆分表格并获取相应的数据,然后将两个结果连接起来。所以我的输出应该如下所示

预期输出

 version value  code   type      year   version value  code    type      year
  PMS    0.00    01    HOURS     2006   000      0.00    04    HOURS     2006
  000    312.00  01    HOURS     2006   000      835.00  04    NON STOCK 2006
  PMS    0.00    01    NON STOCK 2006   000      0.00    04    HOURS     2007
  000    835.00  01    NON STOCK 2006   null     null   null   null      null 

我按照这篇文章尝试了 row_num 方法 How join two tables using SQL without a common column

但我的输出是这样的:

version value  code   type      year   version value  code    type      year
  PMS    0.00    01    HOURS     2006   000      0.00    04    HOURS     2006
  000    312.00  01    HOURS     2006   000      835.00  04    NON STOCK 2006
 

我正在使用 Azure 数据块(SQL-Server)

提前致谢!!

【问题讨论】:

是的,但我们需要查看您的实际查询,而不仅仅是对对您有帮助的问题的参考。 把所有需要的东西都放在你的帖子里。只提供您需要的东西并将其与您的问题联系起来。不要指望我们在别处读到一些东西或猜测哪一部分是相关的。 PS请避免谢谢等。 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于 SQL 包括 DDL 和表格初始化代码。当你得到一个你不期望的结果时,暂停你的总体目标,切到第一个具有意外结果的子表达式并说出你的期望和原因,并通过文档证明是合理的。 How to AskHelp center 你甚至没有解释数据匹配规则。从给出的例子来看,这一行为什么以及如何匹配“000 312.00 01 HOURS 2006 000 835.00 04 NON STOCK 2006”并不明显(至少对我而言) 【参考方案1】:

我使用的是 SQL Server,所以我认为这适用于数据块实现。

基本上我已经创建了 2 个派生表(我编写了 2 个查询来为每个代码提供 row_number 值),然后对这些表进行左连接以提供与您的示例匹配的结果

declare @input table (version nvarchar(max), value nvarchar(max), code nvarchar(max), type nvarchar(max), year int);

insert @input (version, value, code, type, year)
values
('PMS', '0.00', '01', 'HOURS', 2006),
('000', '312.00', '01', 'HOURS', 2006),
('000', '0.00', '04', 'HOURS', 2006),
('PMS', '0.00', '01', 'NON STOCK', 2006),
('000', '835.00', '01', 'NON STOCK', 2006),
('000', '835.00', '04', 'NON STOCK', 2006),
('000', '0.00', '04', 'HOURS', 2007)


select *
from @input; /*original data*/

select *
from /*desired output*/
(
    select ROW_NUMBER() over(order by code) as id, *
    from @input
    where code = '01'
) a
left join
(
    select ROW_NUMBER() over(order by code) as id, *
    from @input
    where code = '04'
) b on a.id = b.id;

【讨论】:

是的,这段代码对我有帮助。但是如果代码 = 01 上的行数更少,代码 = 04 更多。那么左边的加入会有帮助吗? 左连接的工作方式是您将看到 code=01 派生表中的所有内容,并且只有 code=04 派生表中与 code=01 派生表中具有相应匹配项的项目.如果您还需要查看 code=04 派生表中的所有内容,我们可以将连接条件更改为“完全外连接”吗? 完全外连接工作

以上是关于拆分表并在没有公共列的情况下执行连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在第三个表中没有公共列的情况下连接三个表?

连接两个表并在一行中合并多个关联

左连接 3 个表并在空单元格上显示真假

连接没有公共列的sql表而不排序

在没有公共 IP 的情况下通过 http 连接两台计算机

如何在没有连接列的情况下映射一对一关系(实体通过它们的 ID 连接)?