【问题标题】:Fetching values from multiple tables in different columns从不同列中的多个表中获取值
【发布时间】:2016-04-19 19:57:00
【问题描述】:

我需要从多个表中获取数据,但在某些情况下,这里有一些测试脚本来重新创建问题

create table sub_test (sub_id number);

create table sub_svc_test (sub_id number, sub_svc_id number);

create table sub_svc_parm_test (sub_svc_id number, parm_id number, val varchar2(20) );

insert into sub_test values (100);
insert into sub_test values (101);
insert into sub_test values (102);

insert into sub_svc_test values (100,1001);
insert into sub_svc_test values (100,1002);
insert into sub_svc_test values (101,1005);
insert into sub_svc_test values (101,1006);
insert into sub_svc_test values (101,1007);
insert into sub_svc_test values (102,1009);
insert into sub_svc_test values (102,1010);

insert into sub_svc_parm_test values (1001, 51, 'test_id');
insert into sub_svc_parm_test values (1001, 53, 'no');
insert into sub_svc_parm_test values (1002, 54, 'max');
insert into sub_svc_parm_test values (1005, 51, 'test_id');
insert into sub_svc_parm_test values (1007, 51, 'test_id');
insert into sub_svc_parm_test values (1007, 54, 'min');

我需要从 sub_svc_parm_test 表中获取特定 parm_id 的 VAL 列的值,这样

select * from sub_svc_test ss, sub_svc_parm_test ssp
where ss.sub_svc_id = ssp.sub_svc_id and parm_id = 51;

此查询将为我提供 51 parm_id 的 VAL,现在我需要创建一个视图,该视图将显示 parm_id 51、54 但在不同列中的 VAL,例如

select ssp.val, ssp1.val
from sub_svc_test ss, sub_svc_parm_test ssp, sub_svc_test ss1,
     sub_svc_parm_test ssp1
where ss.sub_svc_id = ssp.sub_svc_id
  and ssp.parm_id = 51
  and ssp1.parm_id  = 54
  and ss1.sub_svc_id = ssp1.sub_svc_id;

这个查询会给我输出,但它也会执行交叉连接,因为我没有加入 sub_svc_test ss 和 sub_svc_test ss1 所以它给了我 6 行 2*3 但要求是它应该向我显示任何列的 MAX 行,在我们的例子中它是第一列(3 行),并且没有数据的剩余行可以包含任何字符串或只是 null 像

VAL             VAL_1
--------------     -------------             
test_id         max
test_id         min
test_id         null

我正在使用---- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64 位生产

请询问任何澄清

谢谢

【问题讨论】:

  • 我怀疑如果您学会使用正确的显式JOIN 语法,您的问题就会消失。
  • @Gordon--我知道这些连接并不完美,但是当我加入它们时它没有给我任何结果,因为我们可以看到 sub_svc_id 对于我想要获取的 parm_id 是不同的..还有 EXPLICIT JOIN 你的意思是外连接?
  • 您可以从查询中完全删除两个sub_svc_test,因为您实际上只处理sub_svc_parm_test。因此,您将其所有 51 条记录与其所有 54 条记录交叉连接(即组合)。但我不明白你真正想要达到的目标。你能给出一些示例数据和所需的输出吗?
  • 是的,这里我们只需要来自 SUB_SVC_PARM_TEST 的数据,但我们仍然需要 SUB_SVC_TEST 表,因为我们需要检查订户服务是否是我们需要的服务,并且它在 SUB_SVC_PARM_TEST 表中具有相应的值。实际上在真实数据库中,这些表非常大并且包含更多列,所以我无法在这里写出确切的表结构

标签: sql plsql oracle11g


【解决方案1】:

所以您实际上想要执行两个单独的选择并将它们彼此相邻显示。

也许这样的事情可以工作:

select val, val1 from (
  (select rownum as r, val as val from sub_svc_parm_test ssp1 where parm_id = 51) 
  full outer join 
  (select rownum as r1, val as val1 from sub_svc_parm_test ssp2 where parm_id = 54)
  on r = r1
)

【讨论】:

  • 但您没有考虑查询中的 sub_svc_id 实际上数据库模型就像首先我有一个 sub_id ,其中我可以有多个 sub_svc_id (对于 SUB 拥有的每个服务)。 parm_id 是从另一个表派生的,为了简单起见,我在这里没有提到。所以我们必须确保我们在此处获取的 VAL 仅属于那些具有特定 Service 的 sub_svc_id 和相应的 VAL。但是您的 QUERY 仍然很有帮助,我会尝试在我的要求中使用它。
  • 您应该将其余部分添加到两个子查询中。这会使 SQL 膨胀到两倍大小,并且更难维护(除非您将相同的部分放在视图中),但如果表很大,性能会比其他方法更好。
猜你喜欢
  • 1970-01-01
  • 2013-02-11
  • 2021-06-13
  • 2023-03-08
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多