- ベストアンサー
テーブル結合の方法と注意点
- テーブルの結合方法としては、LEFT JOINを使用します。
- テーブルAとBをB_NOとC_NOを条件に結合し、結果を取得します。
- 注意点として、テーブルAのB_NOとC_NOがNULLの場合でもデータを抽出する方法が必要です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 >とりあえずヒットした1件目のテーブルBのLENとDIVの値を取得することにしようと思っています。 俄かには信じがたい作り方ですが、とりあえずLENとDIVが入っていてもいなくても1件目でいいのですね? SELECT a.A_NO, a.DAT_NO, a.B_NO, a.C_NO, a.D_NO, b.[LEN], b.DIV FROM テーブルA a LEFT OUTER JOIN (SELECT B_NO,C_NO,[LEN],DIV FROM テーブルB b1 WHERE C_DAT_NO IN (SELECT MIN(C_DAT_NO) FROM tableb WHERE B_NO=b1.B_NO AND C_NO=b1.C_NO) ) b ON b.B_NO=a.B_NO AND b.C_NO=a.C_NO 「LEN/DIVが入っているもののうちの1件目」であれば、サブクエリの中身に[LEN] IS NOT NULLなりを条件として追加すればよいですが。。
その他の回答 (2)
- jamshid6
- ベストアンサー率88% (591/669)
記載内容に誤りがあると思います。 >テーブルB(B_NO C_NOが主キー) ・D_NOも含めないとユニークにならない ・カテゴリが「SQL Server」で正しければ、主キーにNULL値は認められないので、 (B_NO, C_NO, D_NOでユニークであったとしても)テーブルBにはおそらく主キーがない また、 ・DAT_NO=1のものにLEN=10,DIV=01が結合されるルールが不明です。 ・DAT_NO=5のものにLEN=30,DIV=03が結合されるルールが不明です。 もう一度質問内容を精査いただけませんか?
- STICKY2006
- ベストアンサー率29% (1536/5269)
>>どのようにすれば思い通りの結果を取得できますか? こんちは。 まず。。。おいらがオバカなのかな?(汗 あなたが思っているものを理解できません。 >>テーブルB(B_NO C_NOが主キー) B_NO,C_NOが主キーなのに 100 1000 A001 10 01 100 1000 A002 10 01 100 1000 A003 Null Null 100 1000 Null Null Null ナゼ、主キーが全部かぶっている?? >>元々はテーブルAとテーブルBを、テーブルAのB_NOとC_NOとテーブルBのB_NOとC_NOを条件に結合(LEFTJOIN)していました。 >>0001 1 100 1000 Null 10 01 この結果を持ってくることすら難しいと思うのですが。。。 コレと 0001 1 100 1000 Null コレで 100 1000 A001 10 01 100 1000 A002 10 01 100 1000 A003 Null Null 100 1000 Null Null Null どうやって、望みどおりの結果データを作るのかが、まず条件的に思い浮かびません。
補足
すいません、テーブルBのレイアウトに記載漏れがありました。 C_DAT_NOも主キーです。 DBはSQLSeverです。 テーブルB(B_NO C_NO C_DAT_NOが主キー) B_NO C_NO C_DAT_NO D_NO LEN DIV 100 1000 1 A001 10 01 100 1000 2 A002 10 01 100 1000 3 A003 Null Null 100 1000 4 Null Null Null 200 2000 1 A002 Null Null 200 2000 2 Null Null Null 300 3000 1 A001 30 03 300 3000 2 Null Null Null >また、 >・DAT_NO=1のものにLEN=10,DIV=01が結合されるルールが不明です。 >・DAT_NO=5のものにLEN=30,DIV=03が結合されるルールが不明です。 >もう一度質問内容を精査いただけませんか? 上記の件に関しては設計者に確認してもあいまいな答えしか返ってこず、わからないので適当にやってくれというような感じです。今はとりあえずヒットした1件目のテーブルBのLENとDIVの値を取得することにしようと思っています。 こんなにあいまいなまま質問してしまい、すいません。