- PR -

MS-ACCESS 異なるCODE間でのMAILの重複をデータを抽出するSELECT文

1
投稿者投稿内容
vanvi
会議室デビュー日: 2008/05/17
投稿数: 3
投稿日時: 2009-03-16 22:31
よろしくお願い致します。

DB:access2003

異なるCODE間でのMAILの重複をデータを抽出するSELECT文を作りたいのですが
うまくいきません。

下記テーブルの※のついているフィールドを抽出したいのですが
私の作ったSQLですと、IDの41、42、43、44のデータが抽出できません。

-------tab---------
ID,CODE,MAIL
11,AAAA,a@a
21,BBBB,b@b
22,BBBB,b@b
31,CCCC,c@c ※
32,CCCC,c@c ※
33,DDDD,c@c ※
41,EEEE,e@e ※
42,EEEE,e@e ※
43,FFFF,e@e ※
44,FFFF,e@e ※
-------------------

========実際に作ったsql=========================
SELECT
ID
FROM
TAB
WHERE
MAIL IN (SELECT
MAIL
FROM
tab
WHERE
MAIL IN (SELECT
MAIL
FROM
tab
GROUP BY
MAIL
HAVING
COUNT(*)>1))
=============================================


どのようにすればよろしいでしょうか?
ご教授のほどよろしくお願い致します。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-03-16 23:01
今、環境無いので動作確認はしてないですが
これでどうでしょう?

コード:
SELECT
    DISTINCT
    A.MAIL
FROM
    (
    SELECT
        MAIL,
        MIN(code) OVER (PARTITION BY MAIL) MIN_CODE,
        MAX(code) OVER (PARTITION BY MAIL) MAX_CODE
    FROM
        tab
    ) A
WHERE
    A.MIN_CODE <> A.MAX_CODE


ACCESS って分析関数使えますよね?
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-03-16 23:10
> 下記テーブルの※のついているフィールドを抽出したいのですが

すみません。
フィールドって書いてあるから MAIL のフィールド欲しいのかと思いましたが
レコードの間違いかな?とも思ったので追記します。

上記の SQL で c@ce@e の2件が(たぶん)取得できると思うので、
それを元に MAIL が一致するレコードを取得すれば※のレコードは
取得できると思います。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-03-16 23:13
何度も何度もすみません。
これで最後です!

コード:
SELECT
    B.*
FROM
    (
    SELECT
        MAIL,
        MIN(code) OVER (PARTITION BY MAIL) MIN_CODE,
        MAX(code) OVER (PARTITION BY MAIL) MAX_CODE
    FROM
        tab
    ) A,
    tab B
WHERE
    A.MIN_CODE = A.MAX_CODE
    AND
    A.MAIL = B.MAIL

vanvi
会議室デビュー日: 2008/05/17
投稿数: 3
投稿日時: 2009-03-18 00:16
King様

ご連絡遅くなりまして申し訳ございません。
ご回答ありがとうごせきざいました。

accessは分析関数が使えなそうです・・・

分析関数使わないと無理ですかね・・・
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2009-03-18 00:56
ACCESSの環境がなく、実装しているか確認できていませんが。。。

次のSQLは、動きますかね?
kingさんのアイデアを、ちょっと改造しただけですが。

コード:
select
  mail,min(code),max(code)
 from tab
 group by mail
  having min(code)<>max(code)



もし、動くor改造できるなら、それをサブクエリにして、例えば次のようなSQLを試してみてください。

コード:
select
  *
 from tab as x
 where exists
(
select
  1
 from tab
 where x.mail=mail
  group by mail
  having min(code)<>max(code)
)

明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2009-03-19 21:08
普通にnot existsでいいでしょう
試してませんが

コード:
select ID,CODE,MAIL
  from tab a
 where exists(select 1 from tab b
               where b.CODE <> a.CODE
                 and b.MAIL = a.MAIL)


1

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