-6

我有两张桌子:

t1:

SSN            NAME       LAST       AD           SAL
-------------- ---------- ---------- ----- ----------
s1             paps                              2600
s2             raj                               1500
s3             rahul

t2:

SSN        NAME       LAST       AD           SAL
---------- ---------- ---------- ----- ----------
s1                    mukh       sbc
s2                    sar        mdn
s3                    das        tly          1100

我想将这两个表合并为一个

t3:

ssn  name  last   ad   sal
---- ----- ----- ---- ----
s1   paps  mukh  sbc  2600
s2   raj   sar   mdn  1500
s3   rahul das   tly  1100 

我怎样才能做到这一点?

4

5 回答 5

2

好吧,您有 4 种不同的方法来合并表格。

  • 首先,您可以创建一个查询,它为您提供结果,就好像它是一个合并:

一个简单的连接:

tsql

  • 或者您可能想要创建一个视图,这是一个新表,其值通过查询实时更新:

使用视图:

create or replace view t3 as
select ssn, t1.name, t2.last, t2.ad, MAX(t1.sal, t2.sal)
  from t1, t2
 where t1.ssn = t2.ssn;
  • 或第三个选项,您可能希望根据前一个的值创建一个新表:

或创建一个新表,并插入另外两个表的值

create table t3 (ssn, name, last, ad, sal);
insert into t3 select ssn, t1.name, t2.last, t2.ad, MAX(t1.sal, t2.sal)
                 from t1, t2
                where t1.ssn = t2.ssn;

你有武器的选择!:-)

关于查询,您可能希望进行比我在示例中编写的更复杂的连接,即:

select * 
  from t1, t2 
 where t1.ssn = t2.ssn 
   and t1.name = t2.name 
   and (t1.last = t2.last 
     or t1.ad = t2.ad 
     or t1.sal = t2.sal);

因为我并没有真正了解您的 t3 连接表值中的逻辑,所以我并没有真正看到您想要什么作为条件。就像列 ad 有abc来自无处的字符串。但是您可以在上一个查询中替换ANDOR以更改选择行为,并添加IF()表达式以选择一个值...

好的,那么这是可能适合您需要的已审核查询(如果sal是数字):

select t1.ssn, t1.name, t2.last, t2.ad, MAX(t1.sal, t2.sal)
  from t1, t2
 where t1.ssn = t2.ssn;

或者

select t1.ssn as ssn, 
       t1.name as name, 
       t2.last as last , 
       t2.ad as ad, 
       if(t1.sal is null,t2.sal,t1.sal) as sal
  from t1, t2
 where t1.ssn = t2.ssn;

或者

select t1.ssn as ssn, 
       t1.name as name, 
       t2.last as last , 
       t2.ad as ad, 
       case when s1.sal is null 
            then s2.sal 
            else s1.sal 
        end as sal
  from t1, t2
 where t1.ssn = t2.ssn;
  • 在 oracle 和 postgresql(但不是 mysql 和 sqlite)中,您也有merge 语句
于 2013-06-09T23:35:08.037 回答
1

你说你想“合并”这些表,但你没有提供足够的细节来给出一个自信的答案而没有一些假设。想到三个问题:

  1. 当有重复行时,其中一个表是否具有优先级?
  2. 这两个表是否总是具有相同的行数?
  3. 您是否真的将第二个表中的项目移动了一列?

根据您的数据,我会说 Table1 具有优先权。我不喜欢从只有三行的样本中假设 (2)。我将假设(3),因为这就是数据的结构方式。

所以,做到这一点的方法是通过full outer join

select  coalesce(t1.ss1, t2.ssn) as ssn, t1.NAME,
        coalesce(t1.last, t2.name) as last,
        coalesce(t1.ad, t2.last) as ad,
        coalesce(t1.sal, t2.sal) as sal
from table1 t1 full outer join
     table2 t2
     on t1.ssn = t2.ssn;
于 2013-06-10T02:03:26.480 回答
0
SELECT t1.ssn,t1.name,t2.name,t2.ad,t1.sal FROM table t1 JOIN table t2 on t1.ssn=t2.ssn

试试这个看看

于 2013-06-10T01:36:39.077 回答
0
SELECT
    * 
 FROM t1
  UNION ALL
 SELECT
   *
 FROM t2
于 2013-06-09T23:34:21.790 回答
0

根据您在 中显示的数据t3,我假设在映射到时t1和之间存在以下关系:t2t3

t3.ssn  = (t1.ssn && t2.ssn)
t3.name = t1.name
t3.last = t2.name
t3.ad   = t2.last
t3.sal  = t1.sal, unless null; t2.sal otherwise

如果这些匹配正确,您应该能够使用以下查询从中提取数据t1并将t2其插入:t3

INSERT INTO t3 (ssn, name, last, ad, sal) (
    SELECT
        t1.ssn, t1.name, t2.name, t2.last, IF(t1.sal IS NOT NULL, t1.sal, t2.sal)
    FROM
        t1
        JOIN t2 ON t1.ssn = t2.ssn
);
于 2013-06-09T23:36:46.560 回答