C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: SQL文について


(過去ログ 116 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■68512 / inTopicNo.1)  SQL文について
  
□投稿者/ くま (25回)-(2013/10/25(Fri) 09:29:57)

分類:[その他の言語] 

2013/10/28(Mon) 15:40:36 編集(投稿者)
2013/10/28(Mon) 15:39:43 編集(投稿者)
2013/10/28(Mon) 15:39:11 編集(投稿者)
2013/10/25(Fri) 11:32:22 編集(投稿者)

投稿し直します。
質問が変わるかもしれないですが、やりたい事をまとめます。
環境はPostgreです。


テーブル1
cd name cd1
001 A 0001
001 A 0002
001 A 0003
002 B 0001
003 C 0002


上記のテーブルを検索します。
cd1が0001と0002にヒットしたものを抜き出します。
結果は以下の通りです。

001 A 0001
001 A 0002


ただ、これだと欲しい結果ではなく、

001 A


の結果が欲しいです。
この状態を抜き出すにはどうすればいいでしょうか。





×以前の投稿
----------
下記に2つのテーブルがあります。
複数検索させようとして、条件として

SELECT テーブル1 FROM テーブル1
WHERE テーブル1.cd = テーブル2.cd
AND テーブル2.cd3 = エー
AND テーブル2.cd3 = ビー
AND テーブル2.cd3 = シー

と指定しています。
すると、下の結果が出ます。
しかし、欲しいのは条件指定後の一番下の状態です。
どうすればいいでしょうか。


テーブル1
cd name cd2
0001 A 000001
0002 B 000002


テーブル2
cd2 cd3
000001 エー
000001 ビー
000001 シー
000001 ディー


条件後の状態
0001 A 000001 エー
0001 A 000001 ビー
0001 A 000001 シー

最終的に欲しい結果
0001 A 000001
引用返信 編集キー/
■68513 / inTopicNo.2)  Re[1]: SQL文について
□投稿者/ shu (403回)-(2013/10/25(Fri) 10:07:51)
No68512 (くま さん) に返信

> SELECT テーブル1 FROM テーブル1
> WHERE テーブル1.cd = テーブル2.cd
> AND テーブル2.cd3 = エー
> AND テーブル2.cd3 = ビー
> AND テーブル2.cd3 = シー
>
> と指定しています。

まずこの文だと不完全なのでエラーになると思います。



> 条件後の状態
> 0001 A 000001 エー
> 0001 A 000001 ビー
> 0001 A 000001 シー
>
テーブル1とテーブル2をcd2で連結して(inner join )
テーブル2.cd3 in ('エー','ビー','シー')をWhere句に指定するとよいです。


引用返信 編集キー/
■68514 / inTopicNo.3)  Re[2]: SQL文について
□投稿者/ くま (26回)-(2013/10/25(Fri) 10:39:12)
No68513 (shu さん) に返信

> テーブル1とテーブル2をcd2で連結して(inner join )
> テーブル2.cd3 in ('エー','ビー','シー')をWhere句に指定するとよいです。

この部分をSQL文にすると、どうなるのでしょうか。
引用返信 編集キー/
■68515 / inTopicNo.4)  Re[3]: SQL文について
□投稿者/ PANG2 (16回)-(2013/10/25(Fri) 10:45:25)
SELECT *
FROM テーブル1
WHERE EXISTS(SELECT * FROM テーブル2 WHERE テーブル2.cd2 = テーブル1.cd2 AND テーブル2.cd3 = 'エー')
AND EXISTS(SELECT * FROM テーブル2 WHERE テーブル2.cd2 = テーブル1.cd2 AND テーブル2.cd3 = 'ビー')
AND EXISTS(SELECT * FROM テーブル2 WHERE テーブル2.cd2 = テーブル1.cd2 AND テーブル2.cd3 = 'シー')
引用返信 編集キー/
■68517 / inTopicNo.5)  Re[3]: SQL文について
□投稿者/ 魔界の仮面弁士 (394回)-(2013/10/25(Fri) 11:11:11)
2013/10/25(Fri) 11:35:31 編集(投稿者)

No68514 (くま さん) に返信
>>> と指定しています。
>>> すると、下の結果が出ます。
>> まずこの文だと不完全なのでエラーになると思います。

FROM 句に テーブル2 が無いのに、WHERE 句で テーブル2 が記載されていますので、
「下の結果が出ます」という状況を、こちらで再現させることができません。


現象を再現可能な SQL を、もう一度投稿しなおして頂けないでしょうか。

SQL に対して「どこが間違っているのか」を指摘するのであれば、まずは
現象を再現できない SQL を見てみないことには、先に進みにくいので…。


> AND テーブル2.cd3 = エー
> AND テーブル2.cd3 = ビー
> AND テーブル2.cd3 = シー
文字列比較でしょうから、「= エー」ではなく「= 'エー'」ですよね。

また、上記で使う論理演算子は、AND では無く OR ではないでしょうか。
AND と OR を間違えただけであれば、文法エラーとはなりませんが、
これらを AND 条件で繋いでしまっては、結果が 0 件になってしまいます。

もし、「エー, ビー, シー の 3 レコードが存在している」ことが
条件なのであれば、 No68515 の PANG2 さんの回答のように、
複数回の存在確認を行うとか、集計するなどの対応が必要です。

SELECT テーブル1.cd, テーブル1.name, テーブル1.cd2 FROM テーブル1
WHERE EXISTS(SELECT cd2 FROM テーブル2
WHERE テーブル1.cd2 = テーブル2.cd2 AND cd3 IN ('エー', 'ビー', 'シー')
GROUP BY cd2 HAVING 111 = SUM(DISTINCT CASE cd3
WHEN 'エー' THEN 100 WHEN 'ビー' THEN 10 WHEN 'シー' THEN 1 END
))



>>テーブル1とテーブル2をcd2で連結して(inner join )
>>テーブル2.cd3 in ('エー','ビー','シー')をWhere句に指定するとよいです。
>
> この部分をSQL文にすると、どうなるのでしょうか。

まずは、回答にあった「INNER JOIN」というキーワードについて
調べてみてください。複数テーブルを結合する際に使われる一般的な
構文なので、使用例もすぐに見つかるかと思います。


なお、SQL 文は、データベースによって『方言』があります。

今回のように実行環境が明かされていない状況では、具体的な SQL を
回答するのは難しいので、概要のみの回答になりがちです。

たとえば shu さんの回答にあった JOIN 構文ですが、これは
Oracle 8i 以下では利用できません(Oracle 9i 以降でのサポート)。
また、私の回答に書いた SQL も、たとえば SQL Server 2008 では使えますが、
Access 2003 では使えません。

次回からは、実行環境も明記されることをおすすめします。
引用返信 編集キー/
■68518 / inTopicNo.6)  Re[4]: SQL文について
□投稿者/ くま (27回)-(2013/10/25(Fri) 11:32:47)
投稿を修正しました。
引用返信 編集キー/
■68521 / inTopicNo.7)  Re[1]: SQL文について
□投稿者/ 魔界の仮面弁士 (395回)-(2013/10/25(Fri) 11:50:54)
2013/10/25(Fri) 12:49:09 編集(投稿者)
No68512 (くま さん) に返信
> 2013/10/25(Fri) 11:32:22 編集(投稿者)
> 投稿し直します。

今回のようなデータの持ち方であれば、cd と name は
別テーブルに正規化しておき、テーブル1 は cd と cd2 だけに
しておいた方が良いかと思います(質問内容とは無関係ですが)。


> 質問が変わるかもしれないですが、やりたい事をまとめます。

テーブル1 を 自己結合 した上で、
No68515 にある PANG2 さんの案を利用できないでしょうか。


SELECT DISTINCT cd, name FROM テーブル1 T1
WHERE EXISTS(SELECT * FROM テーブル1 T2 WHERE T1.cd1 = '0001')
AND EXISTS(SELECT * FROM テーブル1 T3 WHERE T3.cd1 = '0002')



> 環境はPostgreです。
手元に環境が無いので、上記が動くかどうかは分かりません。
引用返信 編集キー/
■68525 / inTopicNo.8)  Re[2]: SQL文について
□投稿者/ PANG2 (17回)-(2013/10/25(Fri) 13:25:44)
2013/10/25(Fri) 15:42:40 編集(投稿者)

SELECT cd, name
FROM テーブル1 t1
WHERE t1.cd1 = '0001'
AND EXISTS(SELECT * FROM テーブル1 t2 WHERE t2.cd = t1.cd AND t2.name=t1.name AND t2.cd1='0002')

引用返信 編集キー/
■68574 / inTopicNo.9)  Re[3]: SQL文について
□投稿者/ くま (28回)-(2013/10/29(Tue) 09:12:43)
2013/10/29(Tue) 09:31:24 編集(投稿者)

いろいろなアドバイスありがとうございます。
EXISTSを使用した方法を試してみたのですが、よく分かりませんでした。
そのため、下記のcountを使う方法で実現しようとしています。

SELECT count(cd) as count,cd, name

FROM test

GROUP BY cd, name
ORDER BY cd


上記のSQLを実行しました。
countが3以上のデータのみを抜き出したいです。

どうすればいいでしょうか。


テーブル1
cd name cd1
001 A 0001
001 A 0002
001 A 0003
002 B 0001
003 C 0002

実行結果
count cd name
3 001 A
1 002 B
1 003 C
引用返信 編集キー/
■68575 / inTopicNo.10)  Re[4]: SQL文について
□投稿者/ kaina (2回)-(2013/10/29(Tue) 09:31:27)
No68574 (くま さん) に返信
> いろいろなアドバイスありがとうございます。
> EXISTSを使用した方法を試してみたのですが、よく分かりませんでした。

少しは自分で考える努力をしてみたらどうでしょうか。
せっかく回答を貰っているのに、よく分かりませんでしたで
済ませているようなら、いつまでたっても
丸投げの質問しか出来ないと思いますよ。

以下EXISTS文のPostgreSQL公式資料

http://www.postgresql.jp/document/9.3/html/functions-subquery.html

引用返信 編集キー/
■68576 / inTopicNo.11)  Re[5]: SQL文について
□投稿者/ くま (29回)-(2013/10/29(Tue) 09:40:31)
No68575 (kaina さん) に返信
1日考えた上での判断です。
引用返信 編集キー/
■68577 / inTopicNo.12)  Re[6]: SQL文について
□投稿者/ くま (30回)-(2013/10/29(Tue) 10:02:45)
2013/10/29(Tue) 10:07:34 編集(投稿者)

HAVINGを追加する事で解決しました。
アドバイス頂いた皆さん本当にありがとうございました。

EXITISなどの処理も実現できるように試してみます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -