我在取消激发两个表之间的连接结果时遇到问题。这两个表定义为:
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工作吗?我可以将其中一个表放入子查询中,但仅用于更改列别名的子查询似乎并不太理想。
正如您所看到的,问题在于列名不明确。确实有两个问题。一个是id列。您可以通过使用不同的连接语法来处理它,而不是使用(id)在j.id=f.id上写入。如果您不熟悉此连接语法,请查看文档。
然而,test_1列名的模糊性不能通过这种方式解决,正如您所看到的,不能将表限定符与unpivot一起使用。
在这种情况下,正确的解决方案是将整个连接作为子查询(而不仅仅是其中一个表)<代码>从(连接子查询)中选择取消Pivot…
当然,您可以更改表中的列名(更改为j_test_1、f_test_1等),但这可能太麻烦了。如果这样做,两个表中的id列名称应该仍然相同,并且仍然需要使用(id)语法。
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 |
+----+--------+-----------+-----------+
问题是这两个表的列名是相同的,如果您尝试在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查询。 提前谢谢你。