我创建了表item
和item2
,我知道它可能是数据冗余,但我想知道如何选择它并创建一个视图?
create table item(
id number(10) primary key,
name varchar2(20),
mark number(10));
insert into item values(10,'Apple1',23);
insert into item values(11,'Apple2',0);
insert into item values(12,'Apple3',0);
insert into item values(13,'Apple4',0);
insert into item values(14,'Apple4',0);
insert into item values(15,'Apple4',0);
insert into item values(16,'Apple4',0);
create table item2(
id number(10),
mark number(10));
alter table item2 add(constraint id_fk FOREIGN KEY (id) references item(id));
Insert into item2 values(10,1);
Insert into item2 values(10,1);
Insert into item2 values(11,7);
Insert into item2 values(12,14);
我可以同时查询:
select * from item;
ID Name Mark
10 Apple1 23
11 Apple2 0
12 Apple3 0
13 Apple4 0
14 Apple4 0
15 Apple4 0
16 Apple4 0
select * from item2;
ID Mark
10 1
10 1
11 7
12 14
我想使用item
和item2
表中的select语句求和得到下面的结果集:
ID Name Mark
10 Apple1 25
11 Apple2 7
12 Apple3 14
13 Apple4 0
14 Apple4 0
15 Apple4 0
16 Apple4 0
如何组合查询以产生输出?
答案 0 :(得分:2)
如果我理解正确,你想“假装”第二个表也有NAME
列,根据第一个表填充;然后你想要GROUP BY id
并获得sum of MARK
。
如果是这样,您可以使用UNION ALL
,而不是连接表来获取名称(在组合表和计算总和之前或之后),在其中插入假NAME
第二个表中包含NULL
的列;然后是group by id
,您对MARK
列求和,然后MAX
超过NAME
。 MAX
忽略NULL
,因此它只会从表ITEM
中选择名称。
下面的解决方案遵循每个细节的逻辑。
select id, max(name) as name, sum(mark) as mark
from ( select id, name, mark
from item
union all
select id, null as name, mark
from item2
)
group by id
;
答案 1 :(得分:1)
您可以在id和mark上将两个表合并在一起。您可以在联合中添加空名称列,并在该字段上执行最大/最小值以从该表中获取一个值。否则,您可以将id和标记合并,然后使用名称连接回原始表,从中获取它并将其包含在组中。
select item_table.id, item_table.name, sum(mark_data_set.mark) as mark_score
from
(select
id, mark
from item
union all
select id, mark
from item2
) mark_data_set
inner join item item_table on (mark_data_set.id = item_table.id)
group by item_table.id, item_table.name
答案 2 :(得分:1)
这个怎么样?
select id,name,(m1 +nvl(m2,0)) mark
from
(select t1.id,t1.name,t1.mark m1,t2.mark m2
from
item t1
LEFT OUTER JOIN
(select id,sum(mark) mark from item2
group by id) t2
ON
t2.id = t1.id
)
order by id;