閲覧ありがとうございます.
現在SQLでデータベースの勉強をしているのですが,existsを用いて商演算を行おうとしてわからない箇所が出てきたので,その点に関しての質問をさせて頂きます.
例として,A,Bと名付けた2つのテーブルを最初に用意します.

[テーブル1(名前:机1)]
| 番号 |氏名|年齢| 好物 |
---------------------------
| 12 | あ | 1 | りんご |
| 23 | い | 1 | すいか |
| 23 | い | 1 | りんご |
| 45 | え | 3 | すいか |
| 45 | え | 3 | りんご |

[テーブル2(名前:机2)]
| 好物 |
----------
| りんご |
| すいか |

この机1を机2で割ることで,この要素を含む氏名を取り出したいと考えて,以下のようなSQL文を実行しました.

select 氏名 from 机1 A
where exists(
select * from 机2 B
where A.好物 = B.好物);

[求めている結果表示]
| 番号 |氏名|
-------------
| 23 | い |
| 45 | え |

[実際に表示された結果]
| 番号 |氏名|
-------------
| 12 | あ |
| 23 | い |
| 23 | い |
| 45 | え |
| 45 | え |

実行すると
(1)氏名が重複で表示されてしまう
(2)「りんご」のみ好物の「あ」も表示されてしまう
という問題が発生してしまい,色々と調べて考えたものの,結局分からなかったので,今に至ります.

長文・駄文すみませんでした.
まだSQLを学び初めて少ししか経っていないので,全く違うことをしていたらすみません.よろしければ,問題解決へのアドバイスをお願いします.

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

SQL 勉強」に関するQ&A: SQLの勉強がしたい

A 回答 (3件)

EXISTSを使って商演算を行っていく順序を書いておきます。



SELECT A.番号, A.氏名, A.年齢, A.好物,B.好物 FROM 机1 A,机2 B
とすることで、机1と机2の全ての組み合わせが出力されます。

| 番号 |氏名|年齢| 好物 |
---------------------------
| 12 | あ | 1 | りんご |
| 12 | あ | 1 |すいか |
| 23 | い | 1 | すいか |
| 23 | い | 1 | りんご |
| 45 | え | 3 | すいか |
| 45 | え | 3 | りんご |

上の表から机1に含まれないレコードを抽出します。


SELECT A.番号, A.氏名, A.年齢, A.好物,B.好物 FROM 机1 A,机2 B
WHERE NOT EXISTS (SELECT * FROM 机1 C WHERE A.番号=C.番号 AND A.氏名=C.氏名 AND A.年齢=C.年齢 AND B.好物=C.好物)

| 番号 |氏名|年齢| 好物 |
---------------------------
| 12 | あ | 1 |すいか |

最後に机1から、番号=12,氏名=あ,年齢=1 ではない番号、氏名を抽出します
データの重複を回避するため、DISTINCTを使用しています。(別に、GROUP BY でも構いません)

SELECT DISTINCT D.番号,D.氏名 FROM 机1 D
WHERE NOT EXISTS
(SELECT A.番号, A.氏名, A.年齢, A.好物,B.好物 FROM 机1 A,机2 B
WHERE NOT EXISTS (SELECT * FROM 机1 C WHERE A.番号=C.番号 AND A.氏名=C.氏名 AND B.好物=C.好物)
WHERE D.番号=A.番号,D.氏名=A.氏名,D.年齢=A.年齢)


上のSQLだと、少し冗長なのでまとめると、

SELECT DISTINCT A.番号,A.氏名 FROM 机1 A WHERE NOT EXISTS
(SELECT 1 FROM 机2 B WHERE NOT EXISTS(SELECT 1 FROM 机1 C
WHERE A.番号=C.番号 AND A.氏名=C.氏名 AND A.年齢=C.年齢 AND B.好物=C.好物))

となります。
    • good
    • 0
この回答へのお礼

こちらが恐縮してしまうほどの丁寧な回答,ありがとうございました.
おかげさまで.商演算において exists はどのような役割を持っているのか,ということについて自分なりに理解することができました.そして,質問の箇所に書いた問題点も,qbr2さんの回答を参考にして,無事に解決することができました.

本当にありがとうございました!

お礼日時:2009/05/27 18:22

人毎に、すべての好物を持つか探す必要があるので、今の正規化されていないテーブル構成では、テーブル1を、「人と好物」の関連付けのためと、最終的に「人を絞る」ための2回、参照する必要があります。



ここのカテゴリ通り、RDBMSはPostgreSQLですか?
バージョンは?

<SQL例1>not existsを2段階で使用
select *
from
(select
"番号","氏名"
from t1
group by "番号","氏名") as x
where not exists
(select 1 from t2 as y
where not exists
(select 1 from t1
where x."番号"="番号"
and y."好物"="好物"
)
)
;

<SQL例2>exceptを使用
select *
from
(select
"番号","氏名"
from t1
group by "番号","氏名") as x
where not exists
(select "好物" from t2
except
select "好物" from t1
where x."番号"="番号"
)
;
    • good
    • 0
この回答へのお礼

書き忘れてしまいすみませんでした.はい,このカテゴリを探したのもお察しの通り postgreSQL を使用しているからです.
あと,バージョンは 1.8.4 です
そして,回答ありがとうございました,先ほどchukenkenkouさんの回答を参考に実行してみたところ,自分が望む結果を得ることができました.
not existを2回実行することや except を使用するなどの方法は知らなかったので,この機会に勉強させて頂きました.
本当にありがとうございました.

お礼日時:2009/05/27 18:14

こんにちは


集合の商演算について、
うまく説明できないので、

多分この参考サイトに答えがのっているのではないでしょうか。

参考URL:http://oraclesqlpuzzle.hp.infoseek.co.jp/12-5.html
    • good
    • 0
この回答へのお礼

回答ありがとうございました.
こんなサイトがあったんですね,まだまだ調べ方が足りなかったようです.すみません.ありがたく参考にさせてもらいます.

お礼日時:2009/05/27 18:09

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

SQL 勉強」に関するQ&A: パースエラーとは?

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

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

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

Qnot only ~ but ( also) のalso

辞書では,not only ~ but (also) というように,also に( )が付いています。
知人の外国人は,「絶対にnot only ~ but also なんて言わない。not only ~ but だけ。」と言います。
私が学校で習った記憶では,also は( )付きではなく,必ず not only ~ but also となっていました。
( )が付いているのは,どちらでもよいという意味なのでしょうか。
それとも,知人が言っていることが正しいのでしょうか。

Aベストアンサー

アメリカに37年住んでいる者です。 私なりに書かせてくださいね。

まず、not only~but (also)はアメリカ人にとっては熟語として考えているわけではありません。

I like not only hot dogs but hambergers.と文章を考えてみてください。I l like といったときに頭の中では「好きなものがあるんだよ」と言うフィーリングがあり、not onlyといったときに既に、hot dogだけでない、と言うフィーリングがあります。butしかし、hambergerが好きです。と言っているわけですね。

ではなぜ、alsoが来る事が多いのでしょう。 それは、人間として「hambergerも」と強く言いたいからなんです。 これはalsoと言う単語のフィーリングですね。 だから、alsoを入れるわけです。 

not onlyで「だけでなく」と言うフィーリングを既にあらわしているわけですから自然に聞いているほうもこの後に他に好きなものを言うなととっさに感じるわけです。 日本語でも同じですね。 もし私が、「好きなのはホットドッグだけでなく」と言ったら、聞いている人はもう何もいわないとは感じないですね。 他に何がすきなんだろう、とかんぐるはずですね。 これと同じなんです。 ですから、butだけでも充分両方が好きだと言う事を表現できるわけです。

さらに、onlyに良く似たjustと言う単語も同じようにフィーリングを表すために使う人も当然でてくるわけです。 熟語だからこういう言い方をしなくてはならないと言う事ではないのですね。 She is not just pretty but (also) very smart.と言う言い方が全く問題なく使えるということになるのです。

ですから、日本人も人によって同じ意味合いでも表現方法が違うようにえいごでもその個人の好みも出てくることもあるわけですね。

これでいかがでしょうか。 分かりにくい点がありましたら、補足質問してください。 

アメリカに37年住んでいる者です。 私なりに書かせてくださいね。

まず、not only~but (also)はアメリカ人にとっては熟語として考えているわけではありません。

I like not only hot dogs but hambergers.と文章を考えてみてください。I l like といったときに頭の中では「好きなものがあるんだよ」と言うフィーリングがあり、not onlyといったときに既に、hot dogだけでない、と言うフィーリングがあります。butしかし、hambergerが好きです。と言っているわけですね。

ではなぜ、alsoが来る事が多い...続きを読む

Qtutorial/funcs.sqlの中のSQL文

の中に

CREATE TABLE EMP (
name text,
salary integer,
age integer,
cubicle point
);

INSERT INTO EMP VALUES ('Sam', 1200, 16, '(1,1)');
INSERT INTO EMP VALUES ('Claire', 5000, 32, '(1,2)');
INSERT INTO EMP VALUES ('Andy', -1000, 2, '(1,3)');
INSERT INTO EMP VALUES ('Bill', 4200, 36, '(2,1)');
INSERT INTO EMP VALUES ('Ginger', 4800, 30, '(2,4)');

-- the argument of a function can also be a tuple. For instance,
-- double_salary takes a tuple of the EMP table

CREATE FUNCTION double_salary(EMP) RETURNS integer
AS 'SELECT $1.salary * 2 AS salary' LANGUAGE SQL;

SELECT name, double_salary(EMP) AS dream
FROM EMP
WHERE EMP.cubicle ~= '(2,1)'::point;

というコードが有るのですが
最後のWHERE EMP.cubicle ~= '(2,1)'::pointの
~=
はどういうもので
どんなときにつかうのでしょうか?
また単なる
=
ではエラーになるようなのですが=との使い分けはどのようにすれば良いのでしょうか?

よろしくお願いします

の中に

CREATE TABLE EMP (
name text,
salary integer,
age integer,
cubicle point
);

INSERT INTO EMP VALUES ('Sam', 1200, 16, '(1,1)');
INSERT INTO EMP VALUES ('Claire', 5000, 32, '(1,2)');
INSERT INTO EMP VALUES ('Andy', -1000, 2, '(1,3)');
INSERT INTO EMP VALUES ('Bill', 4200, 36, '(2,1)');
INSERT INTO EMP VALUES ('Ginger', 4800, 30, '(2,4)');

-- the argument of a function can also be a tuple. For i...続きを読む

Aベストアンサー

~= は幾何データ型の演算子で、位置や形が同じかどうかの比較になります。
幾何データ型の = は面積が同じかどうかの比較になります。

point 型は平面における座標「点」なので、面積を持たないから = が
使えないのではないかと思います。


幾何関数と演算子
http://www.postgresql.jp/document/pg904doc/html/functions-geometry.html

> "同じを示す"~=演算子はpoint、box、polygon、およびcircle型に対し通常の等価概念を示すことに注意してください。
> これらのいくつかの型は=演算子を持ちますが、=は面積の等しさのみを比較します。
> その他のスカラー比較演算子(<=など)は同様にこれらの型の面積を比較します。

幾何データ型
http://www.postgresql.jp/document/pg904doc/html/datatype-geometric.html

Qnot only...but also...について質問です。

not only...but also...について質問です。
not only to tell anything but also...ってどう理解すればいいのでしょうか。
not only not to tell anythingやnot only to tell somethingなら納得いくのですが。
よろしくお願いします。

Aベストアンサー

 文章を、一部だけでなく、全部書いてくださると分かりやすいし、回答もしやすいのですが、これだけですと

 tell anything というのが小さい方、also の後に来るのがでかい方、という決りがあります。だと

 He not only had the temerity to tell anything under the circumstances but also he had the audacity to tell such pack of completely unfounded malicious lies.

「彼はこういった場面で口を開いて何か言うといった生意気なことをしでかしたばかりでなく、こういう根も葉もない全くの嘘八百をぬかす有様だ」

 というふうに、「何かを言う」より大きいものを置けば、理屈に合うのではないでしょうか。前に来るものと後ろに来るものが、前<後、の関係になっていればいいと思います。

 

QPostgreSQL 8.0.2 の ERROR: relation does not exist.

エラーの詳細は以下のとおりです。

まず、ダウンロード後解凍したpostgresql-8.0-ja.msiを
ダブルクリックして、Windows2000serverSP4 に
postgreSQL8.02 をインストールしました。
このときユーザpostgreも新規作成しました。

つぎに、ツールpgAdmin3を使用して上記postgreユーザで
データベースtemplate1のpublicスキームの中に、
ID(int4), Book(text)の2フィールド、IDフィールドをキーとして、
tblBooksという名称の練習用の簡単なテーブルを作成しました。

さらに、pgAdmin3を使用して、このtblBooksテーブルに適当なレコードも4件追加でき、
pgAdmin3のテーブルビューで追加したこのレコード4件を確認できました。

また、pgAdmin3のクエリツールを用いて、クエリの下記を実行すると
正常に実行してくれます。
select version();
"PostgreSQL 8.0.2 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special)"

ところが、上で作成したtblBooksテーブルを含めたクエリを実行させると、
何回やっても次のようなエラーとなります。
select * from tblBooks;
ERROR: relation "tblbooks" does not exist.------(1)

pgAdmin3でなく、ツールpgSQLを使っても同じエラー(1)がでます。
この"relation does not exist"とは一体どんなエラーなんでしょうか?

環境は, Windows 2000 Server SP4 で、
template1,tblBooksは次のようになっています。

CREATE DATABASE template1
WITH OWNER = postgres
ENCODING = 'EUC_JP'
TABLESPACE = pg_default;
GRANT ALL ON DATABASE template1 TO postgres;

CREATE TABLE "tblBooks"
(
"ID" int4 NOT NULL,
"Book" text,
CONSTRAINT "key" PRIMARY KEY ("ID")
)
WITHOUT OIDS;

エラーの詳細は以下のとおりです。

まず、ダウンロード後解凍したpostgresql-8.0-ja.msiを
ダブルクリックして、Windows2000serverSP4 に
postgreSQL8.02 をインストールしました。
このときユーザpostgreも新規作成しました。

つぎに、ツールpgAdmin3を使用して上記postgreユーザで
データベースtemplate1のpublicスキームの中に、
ID(int4), Book(text)の2フィールド、IDフィールドをキーとして、
tblBooksという名称の練習用の簡単なテーブルを作成しました。

さらに、pgAdmin3を使用して、こ...続きを読む

Aベストアンサー

テーブル名に大文字と小文字が混在しているせい
でしょうか。。。
"tblbooks" か "TBLBOOKS" にしたほうがよい
とは思います。

(SQL文としては、大文字小文字どちらか一方
に統一されていれば、
"tblbooks"でCREATEしたテーブルでも、
"TBLBOOKS"でSELECTできるはずです。)

検証したわけではないので、はずしているかもしれませ
んが、CREATE TABLE "tblbooks" で作ってみても、
再現するでしょうか?

Q「not only A but also B 」について

「not only A but also B 」について質問します。
「not only A 」のA部分と「 but also B 」のB部分には
何が入りますでしょうか。調べたところ、色々なパターンが
あり、複雑に感じてしまいました。

また「~, but it also tastes good.」と、( but also B )
でなくbut also の間に主語が入るのも、理解できないでいます。

教えて頂けませんでしょうか。よろしくお願いします。

Aベストアンサー

こんにちは

この用法はA ばかりでなくB も、という意味ですので,二つの間の共通点を述べる時に使います。
たとえば
Not only you but also he is wrong. のように
not only のあとにyou という代名詞だけが来て,but also のあとで、heという違う人物も wrong と言っています。
要するにA,B 同じと言っているわけです。

また、
She not only did not eat but also did not drink.
(彼女は食べないだけでなく,飲む事もしなかった)
というように、A,B,部分で目的語だけを違えて共通点を述べるケースもあります。
この場合はdid not (しなかった)という共通点があります。
いずれも,A,B,違う人間あるいは事柄の間の共通点何を述べる用法です。

but also の間に主語が入るのも一つの用法ですが、
それは、例えば上の文を例にとりますと、
Not only you but also he is wrong. の but 以降を普通に言いますと
He is also wrong.となります。これをそのまま使ったということで、
but it also taste good. も同じ事です。
しかし,これはひとつの用法というだけであって、
but also it taste good. という言い方もあります。
たぶんこの文の前半は  Not only cheap [or something] などのような語が来るのだと思いますが,主語が but also の中に入る入らないはあまり問題ではないと思います。

こんにちは

この用法はA ばかりでなくB も、という意味ですので,二つの間の共通点を述べる時に使います。
たとえば
Not only you but also he is wrong. のように
not only のあとにyou という代名詞だけが来て,but also のあとで、heという違う人物も wrong と言っています。
要するにA,B 同じと言っているわけです。

また、
She not only did not eat but also did not drink.
(彼女は食べないだけでなく,飲む事もしなかった)
というように、A,B,部分で目的語だけを違えて共通点を述べるケ...続きを読む

QSQLのsum関数

こんにちは。
PostgresのSQLが思うように動いてくれません!!
そのIDを持っている人がどのくらいの数を持っているのかを抽出したいのです。
テーブルは下記です。
*********************************************
★Aテーブル
ID  名前  数  場所  日付
0001 みかん 1  冷蔵庫 0901
0001 みかん 4  倉庫  0901
0001 みかん 1  冷蔵庫 0901
0002 いちご 1  部屋  0901
0002 いちご 2  部屋  0801
0003 きのこ 6  倉庫  0901

★Bテーブル
ID  名前
0001 みかん
0002 いちご
0003 きのこ
0004 あいす
*********************************************
となっている場合、下記SQLを実行すると

select a.ID ,b.名前 ,sum(a.数) as 数
from Aテーブル a,Bテーブル b
where a.日付 >= '0901'
and a.日付 <= '0901'
and a.ID = b.ID
group by a.ID ,b.名前, a.数

結果が
0001 みかん 2
0001 みかん 4
0002 いちご 1
0002 いちご 2
となり0001は合計6で出て欲しいのに別々に出てしまいます。
理想では
0001 みかん 6
0002 いちご 3
で出て欲しいです。
たとえばこの場合、場所によってなど出てしまうものでしょうか?
これはなぜなのでしょうか?
よろしくお願いします。

こんにちは。
PostgresのSQLが思うように動いてくれません!!
そのIDを持っている人がどのくらいの数を持っているのかを抽出したいのです。
テーブルは下記です。
*********************************************
★Aテーブル
ID  名前  数  場所  日付
0001 みかん 1  冷蔵庫 0901
0001 みかん 4  倉庫  0901
0001 みかん 1  冷蔵庫 0901
0002 いちご 1  部屋  0901
0002 いちご 2  部屋  0801
0003 きのこ 6  倉庫  0901

★Bテーブル
ID  名...続きを読む

Aベストアンサー

#2です。ちゃんと見ていなかったですが、正規化という意味では、Aテーブルに名前は要らないですね。もしくは、#1さんの言うとおり、JOINする必要はないですね。

Q「not only A, but also B..」の使い方

以下の文章を「not only, but」を使って英訳したいのですが、その使い方が良く分かりません。

「このフェスティバルは彼らだけでなく、私にとっても良いイベントです。」

英訳:
This festival is not only good for them, but also for me.

This festival is good not only for them, but also for me.

上記2つの使い方のうちどちらが正しいですか?どちらも間違っていたら、正しい使い方を教えてください。よろしくお願いします。

Aベストアンサー

2番目のほうが正しいですね。
not only, but alsoの構文はonlyとalsoの直後に比較(?)するものが来るようにします。
したがって、1番目の文ではgoodと for meとなって、これを比較したいのではないですよね。
もちろん
The festival is not only fun, but also educational for all of us.
というような文も可能で、これでしたら、goodと educationalというものの比較となりOKです。
また、細かい事ですが、onlyとalsoの後に来る単語の品詞・表現を統一するようにします。(fun, educationalはともに形容詞)
わかりにくければ追加質問してください。

QSQL文の日本語の箇所で文字化け

環境はxp、apache2、php5、Postgresql8.2です。
1台のPCをサーバ&クライアントにしています。
ただ今PHPとPostgresqlの勉強をしています。

いつも質問に答えてくれてありがとうございます。

bool型のデータを
yの場合は「○」
nの場合は「×」
で表示するために以下のようにしました。

---------------------------
$sql_limit2 = "SELECT m_lecturehistory.lecturecode, CASE WHEN m_lecturehistory.syukketu='y' then '○' else '×' end as syu
FROM m_lecturehistory;";

$sql_limit = mb_convert_encoding($sql_limit2,"EUC-JP","eucJP-win");

$rs_limit = pg_query($d_base,$sql_limit) or die("quary faild sql_limit");
---------------------------

ところが「○」「×」が表示されず
「??」になってしまいます。

文字コードは、
ポスグレとソースは「EUC-JP」
表示は「UTF-8」です。

ご教示して頂けたら幸いです。

環境はxp、apache2、php5、Postgresql8.2です。
1台のPCをサーバ&クライアントにしています。
ただ今PHPとPostgresqlの勉強をしています。

いつも質問に答えてくれてありがとうございます。

bool型のデータを
yの場合は「○」
nの場合は「×」
で表示するために以下のようにしました。

---------------------------
$sql_limit2 = "SELECT m_lecturehistory.lecturecode, CASE WHEN m_lecturehistory.syukketu='y' then '○' else '×' end as syu
FROM m_lecturehi...続きを読む

Aベストアンサー

>文字コードは、
>ポスグレとソースは「EUC-JP」
>表示は「UTF-8」です。

文字コードが違うということですが、http_outputで変換するように記述されてますか?それとも自前で変換して出力いるのでしょうか?

Qnot only~but alsoの構文について

not only~but alsoの構文について
このときのnotとonlyの品詞は何ですか?

Aベストアンサー

それぞれの品詞を考える意味はあまりありませんが,not も only も副詞。

QINSERT,UPDATEしなかったレコードだけをDELETEしたい

質問させてください、
CSV形式の10万行のデータをADO経由でINSERT,UPDATEしています
そのときUPDATEもINSERTもされなかったレコードをDELETEしているんですが、
今はINSERT,UPDATE処理が終わったあと、全レコードのrecordsetを1レコードずつ
csvファイルの1行と比較しています。

他に良い方法はないでしょうか?

csvファイルには
category, item, price
postgresのテーブル名はt_zaikoとして
id(INT[NOT_NULL, default_nextval, primary_key]), category(SMALL_INT), item(TEXT), price(SMALL_INT)
とします。

Aベストアンサー

#1の方のやり方でいいと思いますが、何かそれではまずいということなら

レコード項目にタイムスタンプ持たせといてインサート、アップデート時にその時刻も更新しておいて、処理開始時刻より前のレコードを一括削除すればよいのでは?


人気Q&Aランキング

おすすめ情報