- PR -

データの抽出

1
投稿者投稿内容
ぅうん
会議室デビュー日: 2009/02/27
投稿数: 2
投稿日時: 2009-02-27 01:23
MySQLを使用して勉強しています。
以下のテーブルがあります。
aテーブル
|id |nid |clm1 |clm2 |clm3 |
|1 |aaa |1 |1 |aaa |
|2 |bbb |2 | |bbb |
|3 |ccc |3 |3 |cccc |
|4 |ddd |4 |4 |ddd |

bテーブル
|id |nid |clm1 |clm2 |clm3 |
|1 |aaa |1 |1 |aaa |
|2 |bbb |2 | |bbb |
|3 |ccc |33 |333 |ccc |

条件としては『id』と『nid』が一致しているが
他のカラム『clm1』『clm2』『clm3』が一致していないレコード
ここでいうと
aテーブルの『|3 |ccc |3 |3 |cccc |』
を抽出したいのですが
うまく引き出せません。
ご教授願います。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-27 09:44
a.id = b.id and a.nid = b.nid and
(a.clm1 != b.clm1 or a.clm2 != b.clm2 or a.clm3 != b.clm3)
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2009-02-27 10:57
引用:

Kingさんの書き込み (2009-02-27 09:44) より:
a.id = b.id and a.nid = b.nid and
(a.clm1 != b.clm1 or a.clm2 != b.clm2 or a.clm3 != b.clm3)


ちょっと難癖っぽくてすみませんが、個人的には「答えをそのまま書く」というスタイルは、考える機会を奪ってしまうように思えて好きじゃないんですよ。

この場合「『id』と『nid』が一致している」は、「a.id=b.id and a.nid=b.nid ですよ」くらいに書いた方がいいのではないでしょうか?
(ってか、この程度、マニュアルをよく読んでれば分かるはずのレベルの内容なんですけどね。)

ところで、SQLで不一致というと「<>」ではないでしょうか?
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-27 11:34
不等号については「<>」でした、すみません。

「答えをそのまま書く」については普段はあまりしません。
ただヒントを書いても他の方が答えを書いちゃうので
冬寂さんの様な事を言いたくなる事もあります。

というかそのまま書いたときは
「これくらいわかるだろ?」という意味を含めています。
そう取られなければそれでも良いです。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2009-02-27 11:53
引用:

ところで、SQLで不一致というと「<>」ではないでしょうか?



RDBMSには、少なからず独自機能があります。
MySQLでは、「<>」に加え、「!=」も使用可能です。

http://dev.mysql.com/doc/refman/4.1/ja/comparison-operators.html

MySQLを使用して「勉強中」とのことなので、このテーブルが「扱いやすいテーブルではない」ということを考えましょう。
どうして、こういうテーブル設計になったのでしょうか?
もっと扱いやすいテーブルにできないのでしょうか?
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2009-02-27 12:16
clm1〜3 の値が Null である可能性も考慮するとこうかしら。
コード:

not (a.clm1 <=> b.clm1 and a.clm2 <=> b.clm2 and a.clm3 <=> b.clm3)



# 望む結果次第だけど、and のところは or のほうが適切かもしれない


※日本語修正

[ メッセージ編集済み 編集者: rain 編集日時 2009-02-27 12:31 ]
ぅうん
会議室デビュー日: 2009/02/27
投稿数: 2
投稿日時: 2009-02-28 10:36
Kingさん、
忠犬さん、
rainさん

ありがとうございました。

Kingさんの投稿で抽出が行えました。
また、rainさんの投稿でもnullが考慮された抽出が行えました。

お手数をおかけいたしました。
MySQLの勉強に励みたいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)