- PR -

同じカラムの値が同じで他カラムの値が異なるものの抽出について(MDB2003)

投稿者投稿内容
birdfly
会議室デビュー日: 2006/02/22
投稿数: 19
投稿日時: 2006-05-11 16:52
夏椰さん

長々と教えていただき、ありがとうございました

ご提示いただいた内容で解決できました!!
(かと思いましたが下に続く)

[ メッセージ編集済み 編集者: birdfly 編集日時 2006-05-11 17:34 ]
birdfly
会議室デビュー日: 2006/02/22
投稿数: 19
投稿日時: 2006-05-11 17:18
申し訳ないです。もう一度教えていただけないでしょうか。

教えていただいたSQLをそのまま試したところ確かに値は返ってくるのですが、

引用:

Test.EID in ( '1','2','5') AND
Test.EID in ( '1','2','5')


の箇所を
Test.EID in ( '1','2','5') AND
iTest.EID in ( '1','2','5')

と書き換えたところ値が返ってきませんでした。
iTest.EID in ( '1','2','5')
が正しいと思うのですが、いかがでしょうか。


今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-05-11 17:58
引用:

birdflyさんの書き込み (2006-05-11 17:18) より:

引用:

Test.EID in ( '1','2','5') AND
Test.EID in ( '1','2','5')


の箇所を
Test.EID in ( '1','2','5') AND
iTest.EID in ( '1','2','5')

と書き換えたところ値が返ってきませんでした。
iTest.EID in ( '1','2','5')
が正しいと思うのですが、いかがでしょうか。



あら、失礼。同じ文を書いていましたね。

で、私は仕様を知っているわけではないので、
何が本当に正しいのかわかりません。
で、結果から推測するにたぶんですが
コード:
 iTest.EID in ( '1','2','5') 


はいらないと思います。
#じゃないと、期待した結果は取れないですから。

私が提示したSQLで「相関サブクエリ」ってやつと
「GROUP BY 〜 HAVING 〜」がキーポイントとなるんですが、
そのSQLの動きは理解されていますか?

その内容が理解できていれば、
自分が思う条件を付加することは可能かと思います。

_________________
夏椰 @ わんくま同盟
夏椰の庵
Microsoft MVP for Windows Server System - SQL Server ( Jul 2006 - Jun 2008 )
birdfly
会議室デビュー日: 2006/02/22
投稿数: 19
投稿日時: 2006-05-11 18:35
引用:

私が提示したSQLで「相関サブクエリ」ってやつと
「GROUP BY 〜 HAVING 〜」がキーポイントとなるんですが、
そのSQLの動きは理解されていますか?


すみません。あんまり理解していません。
サブクエリの中でもとの値を使えるとかですよね。

色々試してみましたが、Noを別の名称に変更すると
うまく結果が返ってきませんでした。

やったこと:
1.テーブルのカラム名をNo,EID,GID→rec_id,EID,GIDに変更
2.ご提示いただいたSQLからNoをrec_idに修正
すると結果が返ってこなくなりました。

あと「相関サブクエリ」ってのが関係しているのかテーブルに
別名(AS なんとか)をつけると結果が返ってきませんでした。

ここまでくると自分で調べろって感じなのですが、
よくわかりませんでした。(もちろん調べながらやっています)

なにかヒントをいただけないでしょうか。
よろしくお願いします。

[ メッセージ編集済み 編集者: birdfly 編集日時 2006-05-11 18:47 ]
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-05-11 18:51
引用:

birdflyさんの書き込み (2006-05-11 18:35) より:
やったこと:
1.テーブルのカラム名をNo,EID,GID→rec_id,EID,GIDに変更
2.ご提示いただいたSQLからNoをrec_idに修正
すると結果が返ってこなくなりました。



このやったことによって出来上がったSQL文を
提示することは不可能でしょうか?
birdfly
会議室デビュー日: 2006/02/22
投稿数: 19
投稿日時: 2006-05-11 18:59
お手数をおかけします。
そうですね。先に提示するべきでした。

テーブル:
----------------------
rec_id オートナンバー(主キー) ← Noから名称変更
EID 長整数型
GID 長整数型
----------------------

コード:
SELECT *
FROM Test as t
WHERE t.rec_id In 
(select iTest.rec_id from Test as iTest
 where
   t.EID <> iTest.EID AND
   t.GID = iTest.GID AND
   t.EID in ( 1,2,5)
 group by iTest.rec_id
 having count(iTest.rec_id) >= 3 
 );



コード上は、おかしくないとは思うのですが。
よろしくお願いします。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-05-11 19:28
あ〜・・・・わかったかも。

こんな感じでどうでしょう?
コード:
SELECT *
FROM Test2 t
WHERE EXISTS
(
select GID from Test2  i
where
   t.EID <> i.EID AND
   t.GID = i.GID  AND
   t.EID in ( 1,2,5) 
group by GID having count( GID ) >= 3
 )
;


birdfly
会議室デビュー日: 2006/02/22
投稿数: 19
投稿日時: 2006-05-11 19:50
何度もありがとうございます。

試してみましたが、ヒットしないものがあるようです。

現在のデータを長いですけど貼り付けます。
------------------------
rec_id EID GID
1 2 1062
2 2 1084
3 2 1124
4 2 1368
5 2 1653
6 2 1657
7 6 2066
8 7 2308
9 8 2769
10 2 2853
11 2 2905
12 2 2942
13 3 1062
14 3 3125
15 3 3072
16 3 3154
17 3 3186
18 3 3194
19 1 1062
20 1 1084
21 1 1124
22 1 1159
23 5 1062
24 5 1368
25 2 1657
26 1 445
27 5 907
28 1 1192
29 1 1192
30 5 1192
31 5 1315
32 5 1318
33 5 1331
34 5 1346
35 1 1346
36 5 1352
37 2 1352
38 5 1651
39 1 1651
40 1 1651
41 5 2001
42 1 2091
43 5 2091
44 1 2168
45 5 2168
46 5 2494
47 1 2494
48 2 2507
49 5 2507
50 1 2507
51 1 2555
52 5 2555
53 5 2643
54 5 2850
55 1 2851
56 1 2911
57 5 3098
58 1 3342
59 1 3342
60 1 3342
61 5 3351
------------------------
rec_idが1,19,23のものはヒットするのですが、
48,49,50がヒットしないです。

ご提示いただいたSQLをそのまま実行しました。
なぜでしょう?

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