1

列 D に数字が含まれるすべての人。

2番目のテーブルから人の姓を見つける必要があります。

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

写真 table2 には個人の姓があり、フィールドは last と呼ばれます

私は試した

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

ABC_CHANGE を削除しないようにクエリを修正するにはどうすればよいですか。

追加情報のためだけにクリスタルレポートでこれを行っていますが、SQLPlusでも同じです。

4

4 に答える 4

5

テーブル B に一致するものがない場合でも、テーブル A のすべての行が必要な場合は、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 を「削除」するわけではありません。それはあなたに正しい結果を与えています。行を引き続き表示したい場合 (たとえ 2 番目のテーブルと一致しない場合でも)、左結合を使用する必要があります。これにより、2 番目のテーブルの一致しない列が null として表示されます。

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 に答える