Sql:如何使用ID

时间:2017-01-14 03:14:38

标签: mysql sql sql-server oracle

所以我有这个问题:我有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)?

非常感谢! :)

5 个答案:

答案 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 T1nameT3spent FROM T1T3 WHERE T1。{{1} } = ID_T1T2ID_T1T2 = ID_T2T3

答案 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