2017-03-17 3 views
0

が欠落しているのPostgreSQLに照会すべての結果は、私は、すなわちPostgreSQLの上に2つのテーブルを持っています。 これらの表のそれぞれにデータがあります。表示JOINING値が

Columns in employees: employee_id, employee_name, employer_id. 

Columns in employers: employer_id, employer_name. 

私は関連付けるemployer_nameれていないすべてのEMPLOYEE_NAME年代を表示したいです。

SELECT DISTINCT a.employee_name, b.employer_name 
    FROM employees a 
    NATURAL JOIN employers b 
    WHERE a.employee_name LIKE 'Jack'; 

NB:

は、私は以下のクエリを使用しました! COALESCE(b.employer_name, '') = ''

問題: をレコードが関連付けEMPLOYEE_ID値を含む雇用テーブルに存在しない場合、クエリはすべて何も返さない は、私も自分のクエリに以下に追加しようとしています。私はこれが2つのテーブルに参加することが何もないので仮定していますか?...しかし、私は少なくとも雇用者を持たないすべての従業員を見つけることを望みます。私は理想的にはのemployer_nameの値を私の結果に戻すか、空白/ ''/NULLのどちらかにしたいと思います。

ご協力いただき誠にありがとうございます。

+0

OUTER/RIGHT結合を使用します。結合されたテーブルからのレコードが存在しない場合、外側/右側のテーブルにヌル値の結合結果が得られます – Sharky

答えて

1
select employees.employee_name ,employers.employer_name 
from employees 
left join employers 
on employees.employee_id = employees.employee_id 
where employers.employer_name is NULL 
0

使用LEFT JOIN

SELECT a.employee_name, 
     COALESCE(b.employer_name, 'NA') AS employer_name 
FROM employees a 
LEFT JOIN employers b 
    ON a.employer_id = b.employer_id 
WHERE b.employer_id IS NULL 

あなたの現在のクエリは、任意の雇用者には一致しないあなたは従業員レコードを破棄、INNER JOINをリンクに振る舞うべきNATURAL JOINを、使用していることである最初のものはいくつかの問題を、持っています。代わりにLEFT JOINを使用することで、雇用者の有無にかかわらず、すべての従業員記録を保持することができます。 WHERE句は、結合されたテーブルのNULLをチェックします。NULLは、従業員が雇用者と一致しなかったことを示します。

0

あなたのテーブル名はemployeesです。IMO。エンティティまたはエンティティ間の関係のいずれかをモデル化していますが、両方をモデル化していないという設計の「経験則」があります。この奇妙さを実証するには、関係演算が

employees MINUS employers 

...であることを考えてください。

この設計上の問題の別の症状としては、employeesテーブル内employer_idは述語employee has no employer、nullの可能性を表現するために、プレースホルダのいくつかの種類を持っていなければならないということである(とヌルは、IMOを避けるべきです)。

従業員とその雇用者の関係をモデル化するための3番目の表を導入して、この設計を修正することをお勧めします。ここに別の設計上の問題があります:新しいテーブルの名前をemployeesとするべきではないですか?言い換えれば、ある従業員が雇用主をもっている人の定義ではありませんか?

代わりにこの設計を考えてみましょう:

People: person_id, person_name 
Employers: employer_id, employer_name 
Employees: employer_id, person_id 

を疑似リレーショナル表記法では、従業員でない人の名前を見つけるには:

People MINUS Employees { person_name } 

SQLはかなりより冗長です:

SELECT DISTINCT person_name 
    FROM People 
     NATURAL JOIN 
     (SELECT person_id FROM People 
     EXCEPT 
     SELECT person_id FROM Employees) t; 

元のクエリでは、範囲変数aとを不必要に使用していることに注意してください。 NATURAL JOINのメリットの1つは、重複する列名の削除です。 NATURAL JOINの範囲変数は、常に私にとって奇妙に見えます!

+0

こんにちは@onedaywhen、これは例で、私が扱っているテーブルの名前と情報は異なります。 。それでもあなたの提案をありがとう。 – FireHawk2300