2016-07-26 10 views
1

JOIN自身の表に分析結果がありますか?ON固有の値を保持していない列はありますか?非キー列のセルフ・ジョイン

私が見た自己結合クエリのほとんどは、PKカラムで行われます。私は問題に直面しているので、私は何をしているのか分かりません。

など。

SELECT * 
FROM Employee a 
JOIN Employee b 
ON a.Birthdate = b.Birthdate 
+1

_analytical consequences_を定義しますか?あなたは問題に遭遇したと言いますが、それは何ですか? –

+0

@JonathonOgdenこれは私の質問のより精巧なバージョンです:http://stackoverflow.com/questions/38377403/self-join-produces-inconsistent-value-for-last-month – Disasterkid

+0

広義には、あなたは明らかに自分自身にレコードを結合するでしょう。そのため、Aの従業員レコードは、従業員IDなどの追加の一意のキー列を使用せずにB内で自分自身に参加します。このデータで何を分析していますか?それはあなたにもっと具体的な答えを与えるのに役立ちます。 –

答えて

1

あなたのクエリが今書かれているとして、それはあなたの従業員のすべてのペアを返すよう:

  1. すべての従業員レコードを自分自身にリンクさ返送されます
  2. 同じ生年月日を持つ別の従業員レコード

私はこれがずっと理にかなっているとは思わない。あなたが達成したいこととEmployeeテーブルの構造は何かの詳細な情報を提供できますか?場合Birthdate

がNULL可能である、あなたは、たとえば、同様NULL値に参加するON句を変更する必要があります:

SELECT * 
FROM Employee a 
JOIN Employee b 
ON COALESCE(a.Birthdate,'19000101') = COALESCE(b.Birthdate,'19000101') 
+0

NULLを記載する必要があります – Serg

0

SQL INNER JOINを、CROSSは&暗黙結合(カンマ)すべての結果を登録しよう左の引数行と右の引数行(ソース表の別名ごとに名前が変更された列)とのすべての可能な連結のSQL「クロス積」と呼ぶことができます。 INNER JOINの場合、ONは条件を満たさない結果行をすべて削除します。 (INNER JOIN ON 1 = 1はCROSS &暗黙的JOINと同じです。これはINNER JOINをONにすることができない方言の結果でもあります)。これは、テーブル内のNULLの関係にかかわらずです。

this (dialect-independent) answer explaining INNER/CROSS/implicit JOINsを参照してください。それはまた、すべて JOINが "意味をなさない"と説明しています。 (非リレーショナルSQLテーブル(NULLSまたは重複行を持つテーブル)のSQLの意味は複雑であいまいです)もちろん、間違ったクエリを使用しても意味をなさないはずです。

PSユニークな行だけを選択したいと思うかもしれません。あなたはおそらく行を望ましくないでしょうWHERE a.employee = a.employee。そして列(a.employee、...、b.employee、...)、行(x、...、y、...)と行(y、.. 。、x、...)です。普通の解は、WHERE a. employee <= b.employeeのようなものです。しかし、適切なクエリを書く前に、入力テーブルと結果テーブルの意味を知る必要があります。

関連する問題