プロが教えるわが家の防犯対策術!

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

A 回答 (4件)

比較可能で一意性のある値をもてる項目6をテーブルに追加して、



select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。
    • good
    • 16

Oracleだったらこれでもありかと。



select 項目1, 項目2, 項目3, 項目 from テーブル名 where rowid =
(select min(rowid) from テーブル名 group by 項目1)
    • good
    • 20

SELECT


項目名1,
Min(項目名2) AS Alias,
項目名3,
項目名4
FROM
テーブル
GROUP BY
項目名1,
項目名3,
項目名4
 

この回答への補足

ご回答ありがとうございます。
教えていただいたSQL文についてですが、土日は会社が休みなため月曜日あたりに試してみたいと思います。

ところで、そのSQL文ではSelect文で項目名2に対してMin()を利用して1つの行を選択していますよね。
疑問なのですが、何故項目名1の重複を排除したいのに項目名2に対して条件を設定しているのでしょうか?

また、質問の補足ですが、
項目名1と同様に項目名2~4にも重複する値が存在することがあります(一意でない)。

引き続き回答よろしくお願いいたします。

補足日時:2003/08/23 11:51
    • good
    • 7

うむむ…。

エクセルを使うことはだめなのでしょうか?SQLのみで?
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
仕事の都合上、リアルタイムでデータベースを操作するSQLを書かねばならないのでエクセルを使うことはできません(^^;
せっかくのご意見ですが申し訳ありません。

お礼日時:2003/08/23 11:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q2つの項目が重複するレコードを抽出する方法はありますか?

MySQL4.1で既存データに対し複合キーを新しく設定したいのですが、

ALTER TABLE `test` ADD PRIMARY KEY (`a`,`b`)

としても重複データが存在する為、作成できませんでした。

10万件あるテーブルから重複するレコードを手動で削除したいのですが、aとbが重複しているレコードだけ抽出するSQL文はありますでしょうか?

Aベストアンサー

select * from `test`
where (a,b) in(
select a,b from `test`
group by a,b
having count(*)>1)

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Q[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

初めてお世話になります。

データベース種別はH2です。
参考:http://www.h2database.com/html/main.html

下記のようなテーブルAがあるとします。

  ID  |  TAG  |
―――――+―――――|
  1   |  abc   |
  1   |  def   |
  1   |  ghi   |
  2   |  abc   |
  2   |  ghi   |
  3   |  abc   |
  3   |  def   |
  3   |  ghi   |
  4   |  abc   |


上記テーブルAから下記例のような結果を得られるSQLを知りたいのです。

  ID  |  TAG  |
―――――+―――――|
  1   |  abc   |
  2   |  abc   |
  3   |  abc   |
  4   |  abc   |

上記結果でなくとも、


  ID  |  TAG  |
―――――+―――――|
  1   |  def   |
  2   |  ghi   |
  3   |  def   |
  4   |  abc   |

であっても構いません。(TAG列のデータはどんな内容でもよいです。)

実現させたいのは、
(1)ID列が重複しない結果を表示させたい、
かつ
(2)TAG列も表示させたい
ということです。

これでイケるだろ!と思ってあえなく失敗したSQLは下記です;
select distinct(ID), TAG from A


宜しくお願い致します。

[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

初めてお世話になります。

データベース種別はH2です。
参考:http://www.h2database.com/html/main.html

下記のようなテーブルAがあるとします。

  ID  |  TAG  |
―――――+―――――|
  1   |  abc   |
  1   |  def   |
  1   |  ghi   |
  2   |  abc   |
  2   |  ghi   |
  3   |  abc   |
  3   |  def   |
  3   |  ghi   |
  4   |  abc   |


上記テーブルAか...続きを読む

Aベストアンサー

H2を知らないケド。Oracleだったら。

select ID, MIN(TAG) from A
GROUP BY ID
ORDER BY ID

ではどうでしょう?


select ID, MAX(TAG) from A
GROUP BY ID
ORDER BY ID
もお試しください。

QSQL Left Join で重複を排除するには

Left Joinで左側のテーブルをもとに右側のテーブルを連結したいのですが、右側のテーブルに重複データが存在します。そこで、重複してしいる右側のデータの任意の一つだけを結合したいのですが、どのようにしたらよいでしょうか?
例えば以下の様な内容です。
テーブルA
商品 数量
-----------------------
商品1 10
商品2 20
商品3 30

テーブルB
商品  単価  日付
-----------------------
商品1 100 8/10
商品1 110 8/11
商品3 200 8/12

これらのテーブルを結合して以下のようなデータを取得したいのですが、同のようなSQL文を作成したらよいのでしょうか?

検索結果
商品 数量 単価 日付
-----------------------
商品1 10 100 8/10
商品2 20 NULL NULL
商品3 30 200 8/12

商品1はテーブルBに重複したデータがありますが、いずれか一つを選択できればOKです。
商品2はテーブルBにデータがありませんので、単価と日付はNULLでOKです。

Left Joinで左側のテーブルをもとに右側のテーブルを連結したいのですが、右側のテーブルに重複データが存在します。そこで、重複してしいる右側のデータの任意の一つだけを結合したいのですが、どのようにしたらよいでしょうか?
例えば以下の様な内容です。
テーブルA
商品 数量
-----------------------
商品1 10
商品2 20
商品3 30

テーブルB
商品  単価  日付
-----------------------
商品1 100 8/10
商品1 110 8/11
商品3 200 8/12

これらのテーブル...続きを読む

Aベストアンサー

SQLSERVERということであれば、LEFT JOINの代わりにOUTER APPLYを使ってクエリを簡単にする手もあります。
速度はデータにもよりますが、LEFT JOINより早いようですね。
相対コスト(LEFT JOIN 82:OUTER APPLY 18)

DECLARE @TA TABLE (id INT NOT NULL PRIMARY KEY,item VARCHAR(30),quantity INT)
INSERT INTO @TA VALUES(1,'商品1',10),(2,'商品2',20),(3,'商品3',30)
DECLARE @TB TABLE (id INT NOT NULL PRIMARY KEY,item VARCHAR(30),price INT,saledate DATE)
INSERT INTO @TB VALUES(100,'商品1',100,'2016-08-10'),(101,'商品1',110,'2016-08-11'),(102,'商品3',200,'2016-08-12')

SELECT TA.item,TA.quantity,TB.price,TB.saledate FROM @TA as TA
OUTER APPLY(
SELECT TOP 1 * FROM @TB as TB
WHERE TA.item = TB.item
ORDER BY TB.id
) as TB

SQLSERVERということであれば、LEFT JOINの代わりにOUTER APPLYを使ってクエリを簡単にする手もあります。
速度はデータにもよりますが、LEFT JOINより早いようですね。
相対コスト(LEFT JOIN 82:OUTER APPLY 18)

DECLARE @TA TABLE (id INT NOT NULL PRIMARY KEY,item VARCHAR(30),quantity INT)
INSERT INTO @TA VALUES(1,'商品1',10),(2,'商品2',20),(3,'商品3',30)
DECLARE @TB TABLE (id INT NOT NULL PRIMARY KEY,item VARCHAR(30),price INT,saledate DATE)
INSERT INTO @TB VALUES(100,'商品1',100,'2...続きを読む

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Q2つのテーブルから条件に一致しないデータ抽出

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンター
------------------------------------------

条件は、マスターテーブルの店コードが店コードテーブルに存在
しないデータのみ抽出です。

抽出結果は、以下の様にしたいです。
1、あ、い、6
2、う、え、8

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

わかりずらい質問ですがよろしくお願いします。

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンタ...続きを読む

Aベストアンサー

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S.店コード
where S.店コード is null

または、
SELECT *
FROM マスターテーブル as M
where M.店コード not in ( select 店コード from 店コードテーブル)

等でいけるでしょう。

ただ、参考URLにもありますように、
is null とか not in は遅いです。(Indexで見れなくなるので)
大量データを扱うような場合や、速度が求められるような場合は
別途クエリを検討しましょう。

参考URL:http://www.geocities.jp/mickindex/database/db_optimize.html

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S....続きを読む

QSQL文について(片方のテーブルに存在しないレコード抽出)

以下のような2つのテーブルがあったとして、
2つともに存在する「店コード」を抽出するのはSQLは分かるのですが、
片方に存在しない「店コード」(以下の例の場合、「2」)を抽出するSQLを
一文で書くにはどうすればいいのでしょうか?

<店テーブル>
店コード住所・・・(その他、基本情報)
1aaa
2bbb
3ccc

<販売テーブル>
店コード販売品目・・・(その他、販売数など)
1xxx
3zzz

Aベストアンサー

オプティマイザ次第だけど、NOT-INは、あまりお勧めでない。
外部結合も索引があっても有効に使われないので、お勧めでない。

select * from A where not exists(select 1 from B where A.店コード=B.店コード);

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング