10代と話して驚いたこと

WITH句で複数テーブルを定義する方法を知りたいです。

どこかのサイトで、複数テーブルを定義するには、以下のような
方法にて実現できる旨の記事を目にしました。(withでの宣言テーブル間を「,」で区切る)ですが、「'.' 付近に不適切な構文があります。
」のようにエラーがメッセージ欄に表示されます。

------------------------------------------------------------
WITH a (code, cnt) as (
select code, count(*) from abc
where a is null
group by documentcode),

b (ttr.documentcode, cnt) as (
select ttr.documentcode, count(*) from abc tr inner join def ttr with(nolock)
on tr.seqno = ttr.seqno
where SendTime is null
group by documentcode )

select * from a cross join b;
------------------------------------------------------------

ご存知の方でコメント頂ける方、お手数お掛けしますが、
宜しければ教えて下さい。

A 回答 (3件)

>#1さんの指摘では、ttrがスコープ外?だったから


>いけなかったのでしょうか。

迷走してませんかね?

>b (ttr.documentcode, cnt) as (

CTEで「表名を b 、列名を ttr.documentcode と定義する」という指定になっていますよ?
もし、仮にそういった列名を使いたいなら、標準SQLでは " (二重引用符)、SQL Serverなどは [ ] で囲みますよね?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ごちゃごちゃしていましたが、今、整理できました。

表b (表bの列定義) as (
表bとなるクエリ
)

なので、bの列定義となる列名はなんでもよく、
ただ、私の場合、ttr.documentcodeとなっていたので
その定義の仕方は、よくないでしょ、ってことで
エラーとなっていたんですね。

お礼日時:2009/12/03 09:19

#1さんの指摘部分”だけ”、修正したのですか?



>WITH a (code, cnt) as (
> select code, count(*) from abc
> where a is null
> group by documentcode),

abc表に、code列はあるのですか?
仮にあっても、documentcodeでグループ化しているのだから、おかしいですよね?

>b (ttr.documentcode, cnt) as (



b (documentcode, cnt) as (

としたのでしょうかね?

>select ttr.documentcode, count(*) from abc tr inner join def ttr >with(nolock)
>on tr.seqno = ttr.seqno
>where SendTime is null
>group by documentcode )

グループ化するdocumentcode列は、trとttrのどちらのを使えばいいか曖昧ですよね?
select句でttr.documentcodeを指定するなら、

group by ttr.documentcode

と指定することになりますよね?
    • good
    • 0
この回答へのお礼

おおお、、、、そうですね。。。
今回WITH句をはじめてつかったので、
そのせいだとばかり思っていました。

>>WITH a (code, cnt) as (
>> select code, count(*) from abc
>> where a is null
>> group by documentcode),

>abc表に、code列はあるのですか?
>仮にあっても、documentcodeでグループ化しているのだから、おかし
>いですよね?

上記については、
select documentcode, count(*) from abc
where a is null
group by documentcode
の間違いでした。すみません。
そのままコピペする訳にはいかず、多少クエリを
編集したのですが、その際にミスしました。

#1さんの指摘では、ttrがスコープ外?だったから
いけなかったのでしょうか。
また、、、そうですね。group by後のdocumentcodeに
ttr.をつけてませんでした。

指摘頂いた通り修正後、実行される事が確認できました。
ありがとうございます。

お礼日時:2009/12/02 22:05

> b (ttr.documentcode, cnt)


おかしいのはここです。
=> b (documentcode, cnt)

この回答への補足

教えて頂いた通りにSQLを再発行しました。
その際、以下のエラーメッセージが発生しました。

列名'code'が無効です。
列名'documentcode'があいまいです。

補足日時:2009/12/02 14:48
    • good
    • 0

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

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

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


おすすめ情報