如何在不从table1中删除数据的情况下在sql中连接表

时间:2012-08-29 15:41:59

标签: sql oracle crystal-reports oracle10g

列D中的每个人都有数字。

我需要在第二张桌子上找到一个人的姓氏。

select
    a.TIME_STAMP,
    a.RDATE,
    a.TYPE,
    a.PERSON
from table1 a

a pic http://i50.tinypic.com/6t3iur.jpg table2有人的姓氏,而字段最后被称为

我试过

select
    a.TIME_STAMP,
    a.RDATE,
    a.TYPE,
    a.PERSON,
    b.last,
from table1 a, table b 
where a.PERSON = b.PERSON 

并通过从结果

中删除ABC_CHANGE来输出以下内容

b pic http://i45.tinypic.com/295uw3n.jpg

如何修复查询,以便不会删除ABC_CHANGE。

我在水晶报告中这样做只是为了获取额外信息,但它在SQLPlus中也是如此。

4 个答案:

答案 0 :(得分:5)

如果你想要表A中的所有行,即使表B中没有匹配项,你也需要使用LEFT OUTER JOIN:

select
    a.TIME_STAMP,
    a.RDATE,
    a.TYPE,
    a.PERSON,
    b.last,
from table1 a
LEFT OUTER JOIN table b ON a.PERSON = b.PERSON 

答案 1 :(得分:2)

问题是table1中包含ABC_CHANGE的所有行都没有任何PERSON值。因此,当您使用交叉连接时,将跳过这些行。所以它不是“删除”ABC_CHANGE。它给你正确的结果。如果您希望仍然显示行(即使它们与第二个表中的任何内容都不匹配),您需要使用左连接;这将显示第二个表中任何不匹配列的空值。

select
    a.TIME_STAMP,
    a.RDATE,
    a.TYPE,
    a.PERSON,
    b.last,
from table1 a left join table b 
on a.PERSON = b.PERSON 

然而,这并不符合我对您的需求/要求的理解。

答案 2 :(得分:1)

或完全跳过外部联接,并将姓氏的翻译放在选择列表中,如下所示:

SELECT     a.TIME_STAMP
,     a.RDATE
,     a.TYPE
,     a.PERSON
,     (Select b.last from b where b.person = a.person) last
FROM a
;

答案 3 :(得分:0)

试试这个:

SELECT
    a.TIME_STAMP,
    a.RDATE,
    a.TYPE,
    a.PERSON,
    b.last,
FROM a
LEFT JOIN b ON a.PERSON=b.PERSON
WHERE a.PERSON IS NOT NULL
相关问题