teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

回答の取り下げ

2021/09/15 03:39

投稿

mayu-
mayu-

スコア335

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

1

2021/09/15 03:39

投稿

mayu-
mayu-

スコア335

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 ( T1.ID = T2.ID AND T1.NAME = T2.NAME )
19
+ ON T1.NAME = T2.NAME
18
- OR ( NOT( T1.ID = T2.ID ) AND T1.NAME = T2.NAME )
19
20
  ;
20
21
  ```
21
22