1

对于 D 列中带有数字的每个人。

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

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

一张照片 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 来输出

图片

如何修复查询,使其不会删除 ABC_CHANGE。

我在水晶报告中这样做只是为了获得更多信息,但在 SQLPlus 中也是如此。

4

4 回答 4

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 
于 2012-08-29T15:43:51.903 回答
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 

但是,这与我对您的需求/要求的理解并不相符。

于 2012-08-29T15:45:13.167 回答
1

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

SELECT     a.TIME_STAMP
,     a.RDATE
,     a.TYPE
,     a.PERSON
,     (Select b.last from b where b.person = a.person) last
FROM a
;
于 2012-08-29T20:46:13.273 回答
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
于 2012-08-29T15:48:08.647 回答