2016-09-27 3 views
2

次のように顧客名のペアをリストする必要があります。Oracle Sqlの異なる基準を持つ同じテーブルのペアのリスト

> CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME 

顧客の各ペアは同じ郵便番号(顧客テーブルにもあります)を持つようにします。タスクで

ヒントと言うのヒントがあります:あなたの出力は4つの列を持っている必要があります。CUSTOMER_FIRST_NAME、CUSTOMER_LAST_NAME、CUSTOMER_FIRST_NAME、CUSTOMER_LAST_NAME

は、これは私がこれまでに書かれたものですが。

SELECT DISTINCT CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME 
FROM CUSTOMERS 
WHERE CUSTOMER_ZIP = CUSTOMER_ZIP 

しかし、私は昨日SQLの学習を始めて以来、どのように続行するのか分かりません。同じテーブルに参加しようとしましたが、その結果、あいまいなエラーが発生しました。

更新#1: @ kpater87

SELECT DISTINCT C1.CUSTOMER_FIRST_NAME, C1.CUSTOMER_LAST_NAME , C2.CUSTOMER_FIRST_NAME, C2.CUSTOMER_LAST_NAME 
FROM CUSTOMERS C1 
INNER JOIN CUSTOMERS C2 
ON C1.CUSTOMER_ZIP = C2.CUSTOMER_ZIP 

によって示唆されているように私は、別名を使用してこのコードを書いている。しかし、私は明確な声明を持っているにもかかわらず、それは、重複したデータが表示されます。これが期待されるのですか、何か不足していますか?

+1

ヒント: 'JOIN'、' on'の。 –

+0

'JOIN'は正しい方向です。あいまいなエラーが発生している場所でクエリとして表示してください。カラムエイリアスが不足している可能性があります。 – kpater87

+0

同じテーブルをジョージングするのがいい方法です。クエリには同じ名前のテーブルが2つあるため、おそらくあいまいなエラーが発生します。テーブルのエイリアスが必要なので、2つのテーブルインスタンスを異なるテーブルとして扱うことができます。 –

答えて

1

更新クエリが正常に表示されます。クエリの唯一の問題は、同じレコードにも参加することです。あなたがテーブルの主キーを持っている 場合はWHERE条件を追加して、クエリを向上させることができます

SELECT DISTINCT C1.CUSTOMER_FIRST_NAME, 
    C1.CUSTOMER_LAST_NAME , 
    C2.CUSTOMER_FIRST_NAME, 
    C2.CUSTOMER_LAST_NAME 
FROM CUSTOMERS C1 
INNER JOIN CUSTOMERS C2 
ON C1.CUSTOMER_ZIP = C2.CUSTOMER_ZIP 
WHERE C1.PK <> C2.PK; 

PKは - テーブルの主キーであることの列です。

あなたは主キーを持っていない場合、あなたは試すことができ、この1:

SELECT C1.CUSTOMER_FIRST_NAME, 
    C1.CUSTOMER_LAST_NAME , 
    C2.CUSTOMER_FIRST_NAME, 
    C2.CUSTOMER_LAST_NAME 
FROM CUSTOMERS C1 
INNER JOIN CUSTOMERS C2 
ON C1.CUSTOMER_ZIP = C2.CUSTOMER_ZIP 
WHERE C1.CUSTOMER_FIRST_NAME <> C2.CUSTOMER_FIRST_NAME 
    AND C2.CUSTOMER_LAST_NAME <> C2.CUSTOMER_LAST_NAME 

しかし、まだあなたの出力には、あなたが、例えば取得するという問題があります

Mary Smith James Bond 
James Bond Mary Smith 

順列を削除するには:

SELECT C1.CUSTOMER_FIRST_NAME, 
    C1.CUSTOMER_LAST_NAME , 
    C2.CUSTOMER_FIRST_NAME, 
    C2.CUSTOMER_LAST_NAME, 
    C1.CUSTOMER_ZIP 
FROM T_CUSTOMERS C1 
LEFT JOIN T_CUSTOMERS C2 
ON (C1.CUSTOMER_ZIP = C2.CUSTOMER_ZIP 
    AND 
    C1.CUSTOMER_NUMBER > C2.CUSTOMER_NUMBER); 

も参照してください:SQL: self join using each rows only once

+0

答えのための乾杯しかし、私はあまりにも並べ替えられた行を取り除く必要があります。私は必要なものを持っていますが、私は順列を取り除く必要があります。 – Mephistofee

+0

主キー列はありますか? – kpater87

+0

ありがとうございますCUSTOMER_NUMBER – Mephistofee

関連する問題