下記のようなテーブルから重複なくSELECTしたいと考えています。

temp_table
------------------------
| id | name_1 | name_2 |
------------------------
| 1 | aaaaaa | bbbbbb |
| 2 | cccccc | dddddd |
| 3 | cccccc | dddddd |
| 4 | aaaaaa | bbbbbb |
| 5 | cccccc | jjjjjj |
------------------------

SELECT結果が下記の要になるのが理想です。
DISTINCTを利用して
SELECT DISTINCT id, name_1 || name_2 AS name FROM temp_tableとしましたがダメでした。

---------------------
| id | name     |
---------------------
| 3 | ccccccdddddd |
| 4 | aaaaaabbbbbb |
| 5 | ccccccjjjjjj |
---------------------

よい方法をご存じの方、宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

distinct の使い方が間違ってます。


select distinct on (name_1, name_2) id, name_1, name_2 from temp_table;
    • good
    • 0

idが邪魔ですね



SELECT DISTINCT name_1 || name_2 AS name FROM temp_table

なら大丈夫です
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

関連するカテゴリからQ&Aを探す

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

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

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

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

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

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

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


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

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

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

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

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

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

上のよ...続きを読む

Aベストアンサー

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

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

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

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)

Q複数の条件での絞り込み検索の仕方

PostgreSQLで複数の条件での絞り込み検索をしたいのです。

テーブルには
発売日、商品名、入荷日
があります。
例えば
発売日が2007年5月1日から5月5日で、商品名に「○○」もしくは「××」もしくは「△△」が含まれており、入荷日が一番新しいもの
という条件で検索したいのです。

発売日だけの絞込みならBetweenですし、商品名だけならor、入荷日の最新だったらmaxを使えば個別には検索できるのですが、これをまとめて一行でやるにはどうしたらよいのかわかりません。
それぞれでandでつなげてみましたが、orの条件がうまく反映されず、一個目の○○だけが検索に引っかかってる状態です。
××や△△もひっかかるようにするにはどう記述したらよいのでしょうか。

Aベストアンサー

データ件数がどのくらいあるのかは分かりませんが、ユニークなキーもなく、likeの任意一致をorでつなぐという方法は、性能を出せませんよ?

select *
from t1
where 入荷日 in(
select max(入荷日)
from t1
where 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')
)
and 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')

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...続きを読む

Qcastの使用法について(初心者です)

始めまして。初心者ですので基本的な質問になるかもしれませんがよろしくお願いします!

なぜかPostgreSQLを仕事に使うことになり、四苦八苦しています。

テーブルを作成しているときに、
create table syouhin (shinamono text, nedan int);
とするとします。
で、insert でデータを入れていきますが、
例:
shinamono | nedan
------------------
みかん |100
マンゴー |200

例えば、nedan のcast が今、int にしましたが、これをchar やfloatに変えたいときはどうすればよろしいのでしょうか?

どなたか御存じの方、お手数ですがお教え下さい!!!

Aベストアンサー

CAST関数の文法は、CAST(○ AS △) となります。
○:変換する値
△:変換する型

Select CAST(nedan AS char(10)) ~
とすればできると思いますよ

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.区分

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
もお試しください。

Qテーブルからのselectにおいてデータの有無により結果をわけたい

id | point
----+-------
1 | 10
2 | 9
3 | 5
....
というテーブルがあるとします.
idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです.
plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか?
よろしくお願い致します。

Aベストアンサー

変則的ですが、これでよければidがユニークでなくても大丈夫ですし、集合関数を使わなくてもOKです。

select dm.id,case when ex1.point is null then 0 else ex1.point end from
(select ? as id) as dm left join ex1 on dm.id = ex1.id;

?を適当に変えてください。
chukenkenkouさんの発想はこれですよね。

Qdate型でのbetweenについて教えてください。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date '2007-12-01' and date '2008-01-01'
にすると2007-12-31が該当するのですが、
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'
では2007-12-31のレコードは該当しないものでしょうか??

select * from test where num between 10 and 100
とした場合では、num が 10 ~ 100 のものが問い合わされますよね??
date型になるとこうならないのでしょうか??

よろしくお願いします。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date...続きを読む

Aベストアンサー

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

●時間だけを多少進めたデータを追加してみました

farm=# insert into testtbl6 values('2007-12-31 01:00:00');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
2007-12-31 01:00:00
(2 rows)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '200
7-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

よって、あなたのDBに登録してあるデータは、2007-12-31と午前0時を少し回っているデータが登録されているため、
検索でヒットしないのではないのでしょうか?

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 ...続きを読む


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

人気Q&Aランキング

おすすめ情報