🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SAS

SASは、米SASインスティテュート(SAS Institute)社が開発・販売している製品で、データ解析や統計分析、解析結果の可視化などを行うことができるパッケージソフトです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

739閲覧

複数条件にて結合を行う

quwant

総合スコア5

SAS

SASは、米SASインスティテュート(SAS Institute)社が開発・販売している製品で、データ解析や統計分析、解析結果の可視化などを行うことができるパッケージソフトです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/09/14 06:04

TABLE1とTABLE2をLEFT JOINするのが目的です。
条件は初めにIDで引き当てて、引き当たればそれ以降の結合条件は適用しない。
もし引き当たらなければ次はNAMEで引き当てたいです
しかし、下記の様なクエリを実行するとIDでもNAMEでも引き合ってしまいます。
期待する結果を得るためにはどの様なクエリを書けばよろしいでしょうか?
ご教示いただけると幸いです。

▼期待する結果
ID,NAME,FLG
1,AAA,1
2,BBB,0
3,CCC,0

▼実際の結果
1,AAA,1
2,BBB,0
3,CCC,0
3,CCC,1

▼コード
DATA WORK.TABLE1;
INPUT ID NAME$;
1 AAA
2 BBB
3 CCC
;
RUN;

DATA WORK.TABLE2;
INPUT ID NAME$ FLG;
1 AAA 1
3 BBB 0
5 CCC 1
;
RUN;

PROC SQL;
CREATE TABLE WORK.MERGE AS
SELECT

FROM
WORK.TABLE1 T1
LEFT JOIN WORK.TABLE2 T2
ON T1.ID = T2.ID
OR T1.NAME = T2.NAME
;
QUIT;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quwant

2021/09/14 06:12

SASにてテーブル作成とクエリ実行をしているのでSASタグを付けました。
m.ts10806

2021/09/14 06:17

なるほど そのあたり分かるように質問内に言及いただけたらと
YT0014

2021/09/15 01:07

コードは、コードマークダウンにてご提示ください。
guest

回答2

0

ID連結の結果と、NAME連結の結果を合算すれば良いかと。
なお、NAME連結に際して、ID連結不可の条件を追加する必要があります。

SQL

1SELECT T1.ID, T1.NAME, T2.FLG FROM WORK.TABLE1 T1 JOIN TABLE2 T2 ON T1.ID = T2.ID 2UNION 3SELECT T1.ID, T1.NAME, T2.FLG FROM WORK.TABLE1 T1 JOIN WORK.TABLE2 T2 ON T1.NAME = T2.NAME 4 WHERE T1.ID NOT IN (SELECT T3.ID FROM WORK.TABLE2 T3) 5;

投稿2021/09/15 01:06

YT0014

総合スコア1748

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答を取り下げます。
コメントと一部重複しますけど、理由は以下のとおりです。

ご提示いただいたサンプルデータにおいて
NAMEは、IDに従属すると考えたが
実際は関数従属が成立していない

現状のTABLE1, TABLE2の構成で
IDで結合してもいいのか」どうかを迷い、結果として
私は「しないほうがよい」と判断した
↑↑↑
独断と偏見なので回避するべき思考でした

今思い返すと、SQLを掲載するより先に
テーブル間の矛盾を解消したり
より厳密に個人を特定する手段は講じられないか
といったようなアプローチが良かったのではないかと感じます

  1. 両テーブルで、IDが同一、NAMEが異なっている

  という条件に合致したレコードを抽出して
どちらか一方の値に NAMEを統一する
( 矛盾の解消 )

2. SQL文において、NAMEだけでなく
生年月日や住所、電話番号などといった列とも結合させ
より厳密に個人を特定する
( SQLのロジック改善 )

投稿2021/09/14 14:34

編集2021/09/15 03:39
mayu-

総合スコア335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2021/09/15 01:11 編集

仕様、及び、期待する結果から、TABLE1の3行目は、TABLE2の2行目と結合して、FLGが0になる必要があります。
mayu-

2021/09/15 02:16

私は「仕様」に疑問を持ちました。 NAMEは、IDに従属すると思われるのに なっていない現状のTABLE1, TABLE2の構成で 「IDで結合してもいいのか」どうかを考慮し、 私は「しないほうがよい」と判断しました。 現状で取りえる手段ですと、以下のどちらかだと考えています。 1. 両テーブルで、ID が同一、NAME が異なっている   という条件に合致したレコードを抽出して   どちらか一方の値に NAME を統一する   ( 矛盾の解消 ) 2. SQL文において、NAME だけでなく   生年月日や住所、電話番号などといった列とも結合させ   より厳密に個人を特定する   ( SQLのロジック改善 )
YT0014

2021/09/15 02:45

テーブル設計が良くないという意見には賛同できます。 ただ、その解決手段として、異なる結果を導くSQLを解とするのは、誤りであると判断せざるを得ません。 現状、IDで結合が最優先という仕様が存在している以上、それを無視しての回答は、評価できかねます。
mayu-

2021/09/15 03:03

仕様を確認しないままSQL文を掲載したり、 IDで紐づかないと断言したのは 明らかに私のミスであり、失言だったと反省しています。 今回はSQL文の掲載を取り下げ、見に徹することにいたします。 コメントいただき、ありがとうございました。
YT0014

2021/09/15 03:20

ご返答ありがとうございます。 できましたら、分割などTABLE2のあるべき姿をご提示いただければ幸いです。
mayu-

2021/09/15 04:17

> YT0014さん TABLE1 と TABLE2 は 元が異なるシステムで管理されていた表なのではないかと推測しました。 ( 私が ID で結合するのを躊躇った理由の一つでもあります ) そうなると TABLE2 のデータを頻繁にテコ入れするのが難しく 一定の整合性を確保しつつ、矛盾が生じた場合の解決策を模索して teratailへ質問するに至ったという背景がおありなのではないか、と考えました。 しかし、ID で結合が可能ということは 両テーブルの ID に矛盾が無いという前提条件があってこそだと思います。 「 一部のデータだけ信用がおける項目 」がキー項目ですと どうしても不整合データが生じてしまいがちで 保険として、NAME を第2の結合条件としても NAME は同姓同名の存在と概念がある限り 1:1 の結合にならなかった場合の処置が常に付き纏います。 そのため、両方のデータを突き合わせる時間が確保できず、 時間を置くと、ID や NAME に差分が生じてしまうようでしたら 両テーブルに 電話番号 の列を作成し、 NAME + 電話番号 で結合するのが手っ取り早いのではないかと感じました。 NAME と 電話番号でも、不整合が生じる可能性は勿論あるのですけど ID のようなシステムが自動で付与する番号よりは 人の手で訂正が入る余地が大きいのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問