2009-09-22 51 views
0

我有联接表时(左连接)的问题问题与加入数据库表

表1:

id1 amt1 
1 100 
2 200 
3 300 

表2:

id2 amt2 
1 150 
2 250 
2 350 

我查询:

select id1,amt1,id2,amt2 from table1 
left join table2 on table2.id1=table1.id2 

我假设的O/P是:

 id1 amt1 id2 amt2 
row1: 1 100 1 150 
row2: 2 200 2 250 
row3: 2 200 2 350 

我想在ROW3 O/P作为

2 null 2 350 

即我想避免数据的重复(AMT1)。

+2

真的不给我们太多的工作在这里。这两张桌子各有一列吗?或者table1有4列,table2有2列? 也许你可以给我们一个你想要的结果看起来像什么的确切例子? – 2009-09-22 13:09:37

+0

你试图得到什么样的结果(我不清楚)?两张表之间的关系是什么(是否有外键)? – Mac 2009-09-22 13:11:59

+0

为什么在结果集中没有table1.id1 = 3的行? – 2009-09-23 05:54:04

回答

0

Assuning你想在一个单行的所有数据,你只是做一个工会选择...

选择从表A FIELDA联盟 选择fieldB从表B

请注意,您需要转换数据类型对于两个表来说都是一样的。

如果您需要对方的回答,请格式化业绩优于预期;)

好吧......

你已经纠正了格式化......

在上述情况下,我只想从我的查询中返回2个游标。示例数据没有提供将两个表链接在一起的字段,所以我看不到以合理的方式将它们连接在一起的方式。一个sproc可以返回几个结果集。

0

由于您没有指定任何连接条件,因此您已经完成了两个表的笛卡尔乘积。为了消除重复,你需要指定你想如何加入表。

例如,你可以尝试

select * from table1, table2 where table2.val = 111; 

您的例子没有任何连接键,所以没有明显的价值加入在桌子上。但是更典型的例子是,这两个表格中都会有一个相关的值,以便您可以以有意义的方式将它们结合在一起。

+0

那只有1行的数据,并且会过滤出空的222行 – 2009-09-22 13:15:14

3

这确实是一个格式问题,最好由客户端处理。例如,在SQL * Plus,我们可以使用BREAK ....

SQL> select t1.*, t2.* from t1, t2 
    2/

A B C D   C1 
--- --- --- --- ---------- 
aaa bbb ccc ddd  111 
aaa bbb ccc ddd  222 

SQL> break on a on b on c on d 
SQL> select t1.*, t2.* from t1, t2 
    2/

A B C D   C1 
--- --- --- --- ---------- 
aaa bbb ccc ddd  111 
         222 

SQL> 

注:在没有任何进一步的信息,我选择了一个笛卡尔乘积。

编辑

BREAK是SQL Plus命令,这抑制了我们的行重复列。它只适用于SQL Plus客户端。正如所料,它在Oracle的SQL * Plus用户指南中有介绍。 Find out more.

我用BREAK作为正确的做事方式的一个例子,因为它是干净的,正确地实现了关注点的分离。它正在使用不同的客户端,您需要使用格式化功能。可以调整SQL(见下文),但会降低查询的效用,因为我们无法在其他不想重复使用值的地方重复使用查询。

无论如何,这里是一个解决方案,它在内联视图中使用ROW_NUMBER()解析函数。

SQL> select * from t1 
    2/

A B C D   ID 
--- --- --- --- ---------- 
eee fff ggg hhh   1 
aaa bbb ccc ddd   2 

SQL> select * from t2 
    2/

     C1   ID 
---------- ---------- 
     333   2 
     111   1 
     222   2 
     444   2 

SQL> select t1_id 
    2   , case when rn = 1 then a else null end as a 
    3   , t2_id 
    4   , c1 
    5 from (
    6  select t1.id as t1_id 
    7    , row_number() over (partition by t1.id order by t2.c1) as rn 
    8    , t1.a 
    9    , t2.c1 
10    , t2.id as t2_id 
11  from t1, t2 
12  where t1.id = t2.id 
13  ) 
14 order by t1_id, rn 
15/

    T1_ID A  T2_ID   C1 
---------- --- ---------- ---------- 
     1 eee   1  111 
     2 aaa   2  222 
     2    2  333 
     2    2  444 

SQL> 

我选择不使用LAG(),因为只有拥有固定偏移工作,并且很可能的是排在T2数量将是可变的。

+0

我的问题是改变请看看它吧 你用我的问题回答我的问题我用的是oracle 9i – user2392858 2009-09-23 09:39:30

+0

我还是觉得你的需求比较满意通过在客户端应用格式而不是搞乱SQL。 – APC 2009-09-23 09:48:10

+0

我甚至没有听说过abt'break'你能解释一下吗? thnx提前... – user2392858 2009-09-23 10:11:59