列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中也是如此。
答案 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