当前位置: 首页 > 知识库问答 >
问题:

sql-取消具有相同列名的两个表之间的连接

朱硕
2023-03-14

我在取消激发两个表之间的连接结果时遇到问题。这两个表定义为:

create table scores_jan (
   id number
 , test_1 number
 , test_2 number
 , test_3 number
 );

create table scores_feb (
   id number
 , test_1 number
 , test_2 number
 , test_3 number
 );

insert into scores_jan values (1, 50, 60, 70);
insert into scores_feb values (1, 55, 65, 75);
commit;

我想取消这一点,为每个ID/测试组合获取一行,以实现结果:

ID    TEST_NUMBER    JAN_SCORE    FEB_SCORE
1     test_1         50           55
1     test_2         60           65
1     test_3         70           75

如果我在没有指定感兴趣的列的情况下编写unpivot,它看起来是这样的:

select *
  from scores_jan j
  join scores_feb f
    on j.id = f.id
unpivot ( (jan_score, feb_score) for test_name in ( (test_1, test_1) as 'test_1'
                                                  , (test_2, test_2) as 'test_2'
                                                  , (test_3, test_3) as 'test_3'
                                                  )
        )

这会产生错误ORA-00918:列定义不明确

如果我尝试通过指定要使用的列来编写它,它看起来像这样:

select *
  from scores_jan j
  join scores_feb f
    on j.id = f.id
unpivot ( (jan_score, feb_score) for test_name in ( (j.test_1, f.test_1) as 'test_1'
                                                  , (j.test_2, f.test_2) as 'test_2'
                                                  , (j.test_3, f.test_3) as 'test_3'
                                                  )
        )

这会产生错误ORA-01748:此处只允许使用简单的列名

有办法让这个unpivot工作吗?我可以将其中一个表放入子查询中,但仅用于更改列别名的子查询似乎并不太理想。

共有3个答案

荆炳
2023-03-14

正如您所看到的,问题在于列名不明确。确实有两个问题。一个是id列。您可以通过使用不同的连接语法来处理它,而不是使用(id)在j.id=f.id上写入。如果您不熟悉此连接语法,请查看文档。

然而,test_1列名的模糊性不能通过这种方式解决,正如您所看到的,不能将表限定符与unpivot一起使用。

在这种情况下,正确的解决方案是将整个连接作为子查询(而不仅仅是其中一个表)<代码>从(连接子查询)中选择取消Pivot…

当然,您可以更改表中的列名(更改为j_test_1、f_test_1等),但这可能太麻烦了。如果这样做,两个表中的id列名称应该仍然相同,并且仍然需要使用(id)语法。

雍焱
2023-03-14
select      *

from        (         select 'JAN_SCORE' as mth,id,test_1,test_2,test_3 from scores_jan s
            union all select 'FEB_SCORE'       ,id,test_1,test_2,test_3 from scores_feb s 
            ) unpivot (score for test in (test_1,test_2,test_3))
              pivot (max(score) for mth in ('JAN_SCORE','FEB_SCORE'))

order by    test   
+----+--------+-----------+-----------+
| ID | TEST   | JAN_SCORE | FEB_SCORE |
+----+--------+-----------+-----------+
| 1  | TEST_1 | 50        | 55        |
+----+--------+-----------+-----------+
| 1  | TEST_2 | 60        | 65        |
+----+--------+-----------+-----------+
| 1  | TEST_3 | 70        | 75        |
+----+--------+-----------+-----------+
狄珂
2023-03-14

问题是这两个表的列名是相同的,如果您尝试在UNPIVOT中使用别名,则会出现错误,即需要简单的名称。

在Oracle 12c中,使用外部应用:

select j.id, x.*
  from scores_jan j
  join scores_feb f
    on j.id = f.id
outer apply (
    select 'test_1' test_name, j.test_1 jan_score, f.test_1 feb_score from dual union all
    select 'test_2', j.test_2, f.test_2 from dual union all
    select 'test_3', j.test_3, f.test_3 from dual
) x

在订单版本中,执行联接子查询,执行别名,然后使用UNPIVOT:

select * 
from (      
    select 
        j.id,
        j.test_1 j_test_1,
        j.test_2 j_test_2,
        j.test_3 j_test_3,
        f.test_1 f_test_1,
        f.test_2 f_test_2,
        f.test_3 f_test_3
    from scores_jan j
    join scores_feb f
        on j.id = f.id
    ) 
unpivot (
    (jan_score, feb_score) 
    for test_name in (
        (j_test_1, f_test_1) as 'test_1',
        (j_test_2, f_test_2) as 'test_2',
        (j_test_3, f_test_3) as 'test_3'
    )
);
 类似资料:
  • 问题内容: 我有两个表,它们的列数是可变的。(我不知道有多少列或名称会是什么),例如表A和表B。 表A: 表B 询问: 当TableA和TableB都具有相同名称的列时,我无法区分两个不同的列。例如,两个表都有“名称”列,此查询将导致: 我正在寻找一种区分两个表的方法。最好使用预定义的列名称,例如。 我知道“ AS”关键字,但是问题是我不知道这些列名称将是什么。(我不知道TableA或TableB

  • 我正在运行以下JOOQ查询: table和joinTable都有id作为主键名称,但最终获取实体类包含joinTable的id和table的其余列。如果我重新排序表,结果相似,我有表的ID和joinTable的其余列。

  • 问题内容: 我的MySQL数据库中有这些表: 通用表: Facebook表: 首席表: 基本上,常规表包含一些( 显然 )常规数据。基于generalTable.scenario,您可以在其他两个表中查找更多详细信息,这些表在某些熟悉的列中(例如,expiresAt),而在其他一些列中则不然。 我的问题是,如何仅通过一个查询就可以获取generalTable和正确的明细表的联接数据。 所以,我想这

  • 问题内容: 我有两个表,它们的定义如下: 和这里代表。 我做了一个简单的本地SQL只能加入到选择和为: 但是我在行上遇到异常: 堆栈跟踪 : 您能建议出什么事了吗? 问题答案: 您需要设置结果别名。

  • 问题内容: 我有两个表,它们的定义如下: 和这里代表。 我做了一个简单的本地SQL只能加入到选择和为: 但是我在行上遇到异常: 堆栈跟踪 : 你能建议出什么事了吗? 问题答案: 您需要设置结果别名。

  • 我得到了一个表从SELECT查询1如下从SQL服务器: 我从SQL Server的SELECT query 2中获得了一个表,如下所示: 我想将这些SELECT查询加入到一个SELECT查询中,如下所示: 我试着这样: 但它不起作用,这不是我想要加入的实际表。 基本上,我想连接两个具有相同列名但它们之间没有公共值的SELECT查询。我想使用连接表中的SELECT查询。 提前谢谢你。