所以我有这个问题:我有3个不同的表需要相互连接。这相当复杂,我的英语技能也不是那么好。让我告诉你:
T1 T2 T3
ID_T1 |Name | |ID_T1|ID_T2| |ID_T2|Spent|
1 |James| | 1| 4| | 4 | 200 |
2 |Mike | | 2| 5| | 5 | 300 |
3 |Alex | | 3| 6| | 6 | 400 |
基本上我想在表T3中使用T2中的ID来连接T1中名称的花费。
所以我应该“读”詹姆斯花了200美元,迈克花300和亚历克斯400。
要知道的另一件事是ID是自动生成的,所以我不应该看到它们。
创建表时我是否需要注意某些事情,或者我必须更多地关注INSERT INTO命令(我使用Oracle sql Developer)?
非常感谢! :)
答案 0 :(得分:0)
这应该会给你一个预期的输出。
Select a.Name, c.spend
From T1 a, T2 b, T3 c
Where a.Id_T1 = b.Id_T1
AND b.Id_T2 = c.Id_T2
关于第二个问题,您应该知道表之间的关系,这意味着它们的连接方式。
根据您的评论更新答案。假设金额花费列你将要硬编码..
Select b.Id_T2 , "300"
From T1 a ,T2 b
Where a.Id_T1 = b.Id_T1
但在上述情况下,列支出的所有值都是300。
答案 1 :(得分:0)
@Burkinaboy可能想尝试这个
SELECT
T1.Name,
T3.SPent
FROM T1 t0 RIGHT JOIN T2 t1 ON T1.ID_T1 = T2.ID_T1 RIGHT JOIN T3 t2 ON T3.ID_T2=T2.ID_T2
答案 2 :(得分:0)
SELECT T1
。name
,T3
。spent
FROM T1
,T3
WHERE T1
。{{1} } = ID_T1
。T2
和ID_T1
。T2
= ID_T2
。T3
答案 3 :(得分:0)
select t1.name as name, t3.spent as spent
from t1
join t2 on t2.id_t1 = t1.id_t1
join t3 on t3.id_t2 = t2.id_t2
使用join而不是将所有表放在FROM子句中。
答案 4 :(得分:0)
假设您正在使用新ID在T3表中插入每个支出,您可以加入这三个表并在其上执行分组:
select
T1.ID_T1 ID,
T1.NAME,
SUM(T3.SPENT) SPENT
from T1 inner join T2 on T1.ID_T1 = T2.ID_T1
inner join T3 on T2.ID_T2 = T3.ID_T2
GROUP BY T1.ID_T1, T1.NAME;
截至目前,您还不清楚您正在使用哪个数据库。 (我假设它是甲骨文,因为您正在使用Oracle SQL Developer。类似的解决方案应该可以在其他DBMS中使用,以防万一。)
首先,让我们创建表格:
create table t1 (
ID_T1 integer primary key,
Name varchar2(100)
);
create table t2 (
ID_T1 integer,
ID_T2 integer,
constraint pk primary key(ID_T1,ID_T2)
);
create table t3 (
ID_T2 integer primary key,
spent number(10,2)
);
然后创建两个插入时使用的序列:
create sequence t1_seq start with 1 increment by 1;
create sequence t2_seq start with 1 increment by 1;
然后是一个显示每人消费的视图:
create or replace view spendings
as
select
T1.ID_T1 ID,
T1.NAME,
SUM(T3.SPENT) SPENT
from T1 inner join T2 on T1.ID_T1 = T2.ID_T1
inner join T3 on T2.ID_T2 = T3.ID_T2
GROUP BY T1.ID_T1, T1.NAME;
然后在上面的视图上创建一个INSTEAD OF触发器,以在基础表中进行正确的插入:
create or replace trigger spendings_trig
instead of INSERT or UPDATE or DELETE on SPENDINGS
for each row
declare
v_ID_T1 integer;
v_ID_T2 integer;
v_name t1.name%type;
begin
if not inserting then
raise_application_error(-20001,'Not supported');
end if;
begin
if :new.ID is null then
v_ID_T1 := T1_SEQ.NEXTVAL;
insert into T1 (ID_T1, NAME) values (v_ID_T1, :new.NAME);
end if;
select ID_T1,NAME into v_ID_T1,v_name from T1
where ID_T1 = :new.ID;
if :new.name is not null and v_name <> :new.name then
raise_application_error(-20002,'Incorrect name entered');
end if;
exception
when no_data_found then
v_ID_T1 := :new.ID;
insert into T1 (ID_T1, NAME) values (v_ID_T1, :new.NAME);
end;
v_ID_T2 := T2_SEQ.NEXTVAL;
insert into T2 values (v_ID_T1, v_ID_T2);
insert into T3 values (v_ID_T2, :new.spent);
end;
/
现在,如果你像这样插入视图(假设任何表中都没有数据):
insert into spendings (name, spent) values ('James',100);
T1将获得一行
ID_T1 NAME
------------
1 James
T2将获得一行
ID_T1 ID_T2
------------
1 1
T3将获得一行
ID_T2 SPENT
-------------
1 100
现在,如果你这样做:
insert into spendings (id,spent) values (1,100);
不会插入T1,因为ID = 1
已存在行T2将获得一行:
ID_T1 ID_T2
------------
1 1
1 2
T3将获得一行
ID_T2 SPENT
-------------
1 100
2 100
和
select * from spendings;
将显示:
ID NAME SPENT
------------------
1 James 200