回答編集履歴
2
回答の取り下げ
answer
CHANGED
@@ -1,29 +1,27 @@
|
|
1
|
-
|
1
|
+
**回答を取り下げます。**
|
2
|
-
|
2
|
+
コメントと一部重複しますけど、理由は以下のとおりです。
|
3
|
-
> 1,AAA,1
|
4
|
-
> 2,BBB,0
|
5
|
-
> 3,CCC,0
|
6
3
|
|
7
|
-
|
4
|
+
ご提示いただいたサンプルデータにおいて
|
8
|
-
|
5
|
+
`NAME`は、`ID`に従属すると考えたが
|
6
|
+
実際は関数従属が成立していない
|
9
7
|
|
8
|
+
現状の`TABLE1`, `TABLE2`の構成で
|
9
|
+
「`ID`で結合してもいいのか」どうかを迷い、結果として
|
10
|
+
私は「しないほうがよい」と判断した
|
11
|
+
↑↑↑
|
12
|
+
`独断と偏見なので回避するべき思考でした`
|
10
13
|
|
11
|
-
`
|
14
|
+
今思い返すと、`SQL`を掲載するより先に
|
15
|
+
テーブル間の矛盾を解消したり
|
12
|
-
|
16
|
+
より厳密に個人を特定する手段は講じられないか
|
13
|
-
, T1.NAME As T1_NAME
|
14
|
-
, T2.ID As T2_ID
|
15
|
-
, T2.NAME As T2_NAME
|
16
|
-
, T2.FLG
|
17
|
-
|
17
|
+
といったようなアプローチが良かったのではないかと感じます
|
18
|
-
LEFT JOIN WORK.TABLE2 T2
|
19
|
-
ON T1.NAME = T2.NAME
|
20
|
-
;
|
21
|
-
```
|
22
18
|
|
23
|
-
■結果
|
24
|
-
|
25
|
-
|
19
|
+
1. 両テーブルで、`ID`が同一、`NAME`が異なっている
|
20
|
+
という条件に合致したレコードを抽出して
|
26
|
-
|
21
|
+
どちらか一方の値に `NAME`を統一する
|
22
|
+
( 矛盾の解消 )
|
23
|
+
|
27
|
-
|
24
|
+
2. `SQL`文において、`NAME`だけでなく
|
28
|
-
|
25
|
+
生年月日や住所、電話番号などといった列とも結合させ
|
26
|
+
より厳密に個人を特定する
|
29
|
-
|
27
|
+
( `SQL`のロジック改善 )
|
1
answer
CHANGED
@@ -4,8 +4,10 @@
|
|
4
4
|
> 2,BBB,0
|
5
5
|
> 3,CCC,0
|
6
6
|
|
7
|
+
IDでは紐づかないため、結合条件に含めても意味が無いと思います。
|
7
|
-
以下のような`SQL`でいかがでしょう。
|
8
|
+
シンプルに以下のような`SQL`でいかがでしょうか。
|
8
9
|
|
10
|
+
|
9
11
|
```SQL
|
10
12
|
SELECT T1.ID As T1_ID
|
11
13
|
, T1.NAME As T1_NAME
|
@@ -14,8 +16,7 @@
|
|
14
16
|
, T2.FLG
|
15
17
|
FROM WORK.TABLE1 T1
|
16
18
|
LEFT JOIN WORK.TABLE2 T2
|
17
|
-
ON
|
19
|
+
ON T1.NAME = T2.NAME
|
18
|
-
OR ( NOT( T1.ID = T2.ID ) AND T1.NAME = T2.NAME )
|
19
20
|
;
|
20
21
|
```
|
21
22
|
|