【发布时间】: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 表中具有相应的值。实际上在真实数据库中,这些表非常大并且包含更多列,所以我无法在这里写出确切的表结构