質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

1837閲覧

WITH を使うと構文エラーに

kotoraemon

総合スコア21

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/10/23 14:13

編集2019/10/23 14:34

WITHを使わなければ動くコードが、WITHを使って書こうとすると構文エラーが発生します(postgreSQL)。
どこがおかしいのでしょうか?
初心者ゆえ基本的なミスかもしれませんが、教えていただけるとありがたいです。

エラーは以下の通りです。
--ERROR: syntax error at or near "A"
--LINE 16: WHERE personid IN A

WITHありのコード

sql

1WITH A AS (SELECT personid 2 FROM filmrating NATURAL JOIN filmparticipation 3 NATURAL JOIN person 4 WHERE votes > 60000 5 AND rank >= 8 6 AND parttype = 'director') 7 , B AS (SELECT personid 8 FROM filmrating NATURAL JOIN filmparticipation 9 NATURAL JOIN person 10 WHERE votes > 60000 11 AND rank < 8 12 AND parttype = 'director') 13SELECT DISTINCT UPPER(firstname|| ' ' || lastname) AS fullname 14FROM filmrating NATURAL JOIN filmparticipation 15 NATURAL JOIN person 16WHERE personid IN A 17AND NOT personid IN B; 18

WITHなしのコード

sql

1SELECT DISTINCT UPPER(firstname|| ' ' || lastname) AS fullname 2FROM filmrating NATURAL JOIN filmparticipation 3 NATURAL JOIN person 4WHERE personid IN (SELECT personid 5 FROM filmrating NATURAL JOIN filmparticipation 6 NATURAL JOIN person 7 WHERE votes > 60000 8 AND rank >= 8 9 AND parttype = 'director') 10AND NOT personid IN (SELECT personid 11 FROM filmrating NATURAL JOIN filmparticipation 12 NATURAL JOIN person 13 WHERE votes > 60000 14 AND rank < 8 15 AND parttype = 'director'); 16

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

7.8. WITH問い合わせ(共通テーブル式)

WITHは、より大規模な問い合わせで使用される補助文を記述する方法を提供します。 これらの文は共通テーブル式(Common Table Expressions)またはCTEとよく呼ばれるものであり、1つの問い合わせのために存在する一時テーブルを定義すると考えることができます。

withはテーブル式ですからテーブルと同じように扱わねばなりません。

SQL

1WITH A AS (SELECT personid 2 FROM filmrating NATURAL JOIN filmparticipation 3 NATURAL JOIN person 4 WHERE votes > 60000 5 AND rank >= 8 6 AND parttype = 'director') 7 , B AS (SELECT personid 8 FROM filmrating NATURAL JOIN filmparticipation 9 NATURAL JOIN person 10 WHERE votes > 60000 11 AND rank < 8 12 AND parttype = 'director') 13SELECT DISTINCT UPPER(firstname|| ' ' || lastname) AS fullname 14FROM filmrating NATURAL JOIN filmparticipation 15 NATURAL JOIN person 16WHERE personid IN (select personid from A) 17AND NOT personid IN (select personid from B) 18;

投稿2019/10/23 17:07

sazi

総合スコア25199

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/10/23 17:17

あくまで文法エラーに関する回答です。 withへの切り出し方とかそもそも意味があるのかについては疑問があるところですけど。
kotoraemon

2019/10/23 21:13

ありがとうございます。よくわかりました。 ここでWITHを使う意味はなさそうですね。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問