こんにちは、ちょっと複雑なSQLの結合で困っています。
次のような名簿テーブルがあります。
ID, Name, IsMarried
1, 田中, True
2, 鈴木, True
3, 高橋, False
4, 中村, True
「IsMarried」は結婚しているかどうかを示しています。
そして、次のような属性テーブルがあります。
ID, ParentID, Type, Value
1, 1, 1, 55kg
2, 1, 2, 170cm
3, 1, 3, AB型
4, 2, 1, 52kg
5, 2, 2, 165cm
6, 3, 3, B型
7, 4, 1, 45kg
8, 4, 2, 180cm
ParentIDは、名簿テーブルのIDに対応しています。
Typeは、1が体重、2が身長、3が血液型です。
Valueに実際の値が入っています。
ここで、「既婚者」を全員抽出して、"登録されている場合は"その血液型を表示するSQLを書きたいのですが、うまく行きません。どうしたらよいでしょうか?
結果は次のようになります。
ID, Name, BllodType
1, 田中, AB型
2, 鈴木, null
4, 中村, null
Select 名簿.ID, 名簿.Name, 属性.Value from 名簿 [Inner/Left] Join 属性 on 名簿.ID = 属性.ParentID Where 名簿.IsMarried = True AND 属性.Type = 3
このようにすると、血液型が登録されている田中さんしか表示されません。
条件指定を外すと体重や身長も表示されます。
ExcelのVBAからADODBでAccessのmdbファイルにアクセスしています。
Windows 7 64bit、Office 2007です。
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
Access持ってないので、確認はできませんが。
#6 の最初の方法だと
名簿.ID,属性.type
4,1
4,2
ができるので、4,NULLの行が無い→where に該当しない、となりそうですが
その次のやつは
Select 名簿.ID, 名簿.Name, 属性.Value from 名簿
Left Outer Join
(select ParentID,Value from 属性 where Type = 3) as T
on 名簿.ID = T.ParentID
Where 名簿.IsMarried = True
で動きませんか?
#1でエラーになる、というのも気になります。
No.6
- 回答日時:
>エラーメッセージは「結合式がサポートされていません」とだけ表示されます。
ということだったのですね。了解です。
Select 名簿.ID, 名簿.Name, 属性.Value from 名簿
Left Outer Join 属性 on 名簿.ID = 属性.ParentID
Where 名簿.IsMarried = True
AND (属性.Type = 3 or 属性.Type is null)
または、
Select 名簿.ID, 名簿.Name, 属性.Value from 名簿
Left Outer Join
(select 属性.Value from 属性 where 属性.Type = 3) as 属性
on 名簿.ID = 属性.ParentID
Where 名簿.IsMarried = True
※ as 属性 は、単に 属性 かも。
あたりではどうでしょう?
(また、サポートされていませんとかでるかもしれませんが。)
ありがとうございます!!できました!
AND (属性.Type = 3 or 属性.Type is null)
職人技というか頭が柔らかいというか、感服しました。
Where 句を追加することも試みていたのですが、 3 以外を除外したり、> 3 and < 3 とかで範囲を除外しようとしたり、こざかしいことばかり試していました。AND + () にして、9 と null の両方を取れば条件に一致するのですね。
2つめのSQL文は動きませんでした。
as の部分を変えたり、カッコの中と外でテーブル名に異なる別名を付けましたがうまくどれもfrom文がおかしいとか、結合分がサポートされていないとか表示されてしまいました。
勉強になりました!助かります
No.4
- 回答日時:
テーブル構造を変更出来ないのであれば、強制的に列[ BloodType]を生成するしかないと思いますよ。
SELECT 名簿.Name, (Select Value FROM 属性 WHERE 属性.ParentID=名簿.ID AND 属性.Type=3) AS BloodType
FROM 名簿
WHERE (((名簿.IsMarried)=True));
*添付図ではNull を空で表示しています。
ありがとうございます。
workaround として、すべての名簿IDに対して、type 3の属性レコードを1件ずつ自動で生成して、血液型はとりあえず "" にするということをしていました。これはこれで動いているのですが、ソフトウェア側から操作した場合に血液型レコードのない人名が登録されてしまうので困っていました。
せっかく教えていただきましたが、シンプルな Where 句で AND (3 or null) のSQLを使うことにします。
お手間を取らせました。
勉強して出直してきますので、またよろしくお願いします。
No.3
- 回答日時:
ANO.1の方のSQLは間違っているように見えないのだけど。
(エラーが出たときは、どういうエラーがでたか詳しく書かないと答えようもないですよ。)
それはさておき、本題のほうですが。
Select 名簿.ID, 名簿.Name, 属性.Value
from 名簿 Left Outer Join 属性
on 名簿.ID = 属性.ParentID
AND 属性.Type = 3
Where 名簿.IsMarried = True
ではどうですか?
Left Join ってものによっては、Left Inner Joinの省略形で、
Inner Koinて書いているのと同じだったりすることもあるので。
ありがとうございます。
エラーメッセージは「結合式がサポートされていません」とだけ表示されます。
「AND 属性.Type = 3」をそっくり削除すると動作します(期待動作ではありませんが)。
「名簿.ID = 属性.ParentID AND」部分を削除しても同じエラーが出るので、On の後に 属性.Type = 3 という形式は使えないのではないかと疑っています。
エクセルVBAからADODBで操作する場合には使えない書き方なのかもしれませんね。
No.2
- 回答日時:
【属性】
ID___________1
ParentID_____1
Weight_______55Kg
Height_______170cm
BloodType____AB型
Q、どうしたらよいでしょうか?
A、一番良いのは、テーブル「属性」の列を上のように変更。
更に言えば、主テーブルと属性テーブルとに分離する必要性はないようですね。
<理由>列[ID]、列[ParentID]の値は常に一致するから。
【名簿】
ID___________1
Name_________田中
IsMarried____True
Weight_______55Kg
Height_______170cm
BloodType____AB型
とテーブル「名簿」の設計を変更すれば、もっと簡単に事は達成できるかと思いますよ。
ありがとうございます。
残念ながらこの構造は変えられないのです。
あるソフトウェアが扱うデータベースを、エクセルから強制的に変更しようというもので、構造を変えるとソフトウェア側が対応できなくなってしまうのです。
No.1
- 回答日時:
属性の中から、Type=3のものだけを抜き出して、joinすればよいでしょう。
JOINのONで指定できるのは、tableA.colA=tableB.colB だけではありません。
Select 名簿.ID, 名簿.Name, 属性.Value from 名簿
Left Join 属性 on 名簿.ID = 属性.ParentID AND 属性.Type = 3
Where 名簿.IsMarried = True
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Accessの参照フィールドの列がずれてしまいます 1 2023/07/19 15:00
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- MySQL mysqlの結合について教えてください 1 2022/05/19 15:13
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
Null同士の結合
その他(データベース)
-
LEFT JOIN をしているのに表示されない
その他(データベース)
-
SQLで、Join句で結合したテーブルにデータが無い場合について
SQL Server
-
-
4
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
5
エクセルで折り返しと縮小の同時設定は無理?
Excel(エクセル)
-
6
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
7
where句中のtrim関数について
Oracle
-
8
複数のテーブルから値を合計出力するSQLについて
MySQL
-
9
datetime型でNULL値を入れたい。
SQL Server
-
10
副問合せにLIKE文を使う方法はないでしょうか?
Oracle
-
11
SQL Date型の列から年月だけを取得したい
SQL Server
-
12
Accessクエリーで両方のテーブルの全てのデータを表示することは可能ですか?
Access(アクセス)
-
13
セレクトメニューで2つの項目や値を渡す方法はありますか?
HTML・CSS
-
14
CASE文のエラーについて
Oracle
-
15
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
16
2つの列が同じ値の行を取得するSQL
Oracle
-
17
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
18
NULLを含む文字列の結合で困っています。
Visual Basic(VBA)
-
19
異なるスキーマからデータを抽出するには?oracl、PL/SQL
Oracle
-
20
テーブルレーコードをソートして更新するにはどうしたらいいでしょうか?
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
3つの表を1つに縦に連結する
-
ACCESSに同時アクセス(編集)を...
-
Accessレコードの追加や変更が...
-
SQLで日付を条件に削除したい
-
Accessクエリでの、LIKE条件
-
Accessでvlookupみたいなことは...
-
2つのテーブルAとBをマージ...
-
時間の足し算
-
SQLで条件指定結合をしたいがNU...
-
DAOのTableDefs("TblName").Con...
-
ファイルメーカ 検索実行せず...
-
ACCESSで指定されたテーブルか...
-
Accessの追加クエリで既存のテ...
-
access テーブル内のレコード...
-
Access 複数テーブルのレコー...
-
ツリー構造をRDBで表現するには?
-
AccessでExcel出力する際に「シ...
-
INSERT時にデータ登録とmaxの発...
-
ACCESS VBA 並び替え 列 カウ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
access テーブル内のレコード...
-
SQLで日付を条件に削除したい
-
Accessでvlookupみたいなことは...
-
ACCESSで指定されたテーブルか...
-
Accessレコードの追加や変更が...
-
Accessでテーブルからテーブル...
-
Accessクエリでの、LIKE条件
-
ACCESSに同時アクセス(編集)を...
-
3つの表を1つに縦に連結する
-
ツリー構造をRDBで表現するには?
-
SQLで条件指定結合をしたいがNU...
-
2つのテーブルを比較して一致し...
-
Accessの追加クエリで既存のテ...
-
リンクテーブルを CopyObject ...
-
デザインビューで、連結式 を...
-
ODBCで接続するとDBに変更/追加...
-
Accessで、複数のテーブルで随...
-
時間の足し算
-
翌営業日までの日数をSQLで求め...
おすすめ情報