
こんにちは、ちょっと複雑な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も見ています
-
SQLで、Join句で結合したテーブルにデータが無い場合について
SQL Server
-
JOINで1つのテーブルに空白があると表示されない
MySQL
-
Null同士の結合
その他(データベース)
-
-
4
3つ以上のテーブルをUNIONするのは現時的でないでしょうか?
MySQL
-
5
選択クエリで空欄のテーブルがあっても表示したい
Access(アクセス)
-
6
型 varchar から型 numeric への変換エラー。
その他(データベース)
-
7
DataGridViewに空白がある場合はエラーにしたい
Visual Basic(VBA)
-
8
select句副問い合わせ 値の個数が多すぎます
Oracle
-
9
VB2010でデータグリッドビューに列追加
Visual Basic(VBA)
-
10
LEFT JOIN をしているのに表示されない
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
Accessで、複数のテーブルで随...
-
ACCESSのSQLで数値型に変換する...
-
SQLで条件指定結合をしたいがNU...
-
アクセスで消し込みがしたい
-
Accessレコードの追加や変更が...
-
ID列を含むテーブルコピー、編集
-
accessで指定期間の曜日カウン...
-
2つのテーブルを比較して一致し...
-
Accessでテーブルからテーブル...
-
AccessでExcel出力する際に「シ...
-
リンクテーブルを CopyObject ...
-
ACCESSのSQLで・・・
-
Accessクエリでの、LIKE条件
-
【Access】2つのテーブル 複数...
-
access2003で桐の表引きのよう...
-
Windows8、Access2013でのクエリ
-
ACCESSに同時アクセス(編集)を...
-
アクセスのテーブル間で同じ値...
-
Accessのテーブルをインターネ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
Accessでテーブルからテーブル...
-
Accessの追加クエリで既存のテ...
-
Accessでvlookupみたいなことは...
-
Accessクエリでの、LIKE条件
-
access テーブル内のレコード...
-
Accessレコードの追加や変更が...
-
2つのテーブルを比較して一致し...
-
ACCESSに同時アクセス(編集)を...
-
INSERT時にデータ登録とmaxの発...
-
デザインビューで、連結式 を...
-
ACCESSのSQLで数値型に変換する...
-
パススルークエリをテーブル作...
-
テーブル作成クエリで主キーを設定
-
3つの表を1つに縦に連結する
-
Accessで、複数のテーブルで随...
-
AccessでのNULLのレコードの表...
-
SQLで条件指定結合をしたいがNU...
-
ODBCで接続するとDBに変更/追加...
-
SQL: SELECT UNIONすると文字数...
おすすめ情報