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

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

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

Re[5]: UNIONの使い方だと思います。


(過去ログ 32 を表示中)

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

■15297 / inTopicNo.1)  UNIONの使い方だと思います。
  
□投稿者/ 初心者 (53回)-(2008/03/10(Mon) 18:38:18)

分類:[.NET 全般] 

select A.SEQ1,AAA,BBB
from
TABLE_A A,
TABLE_B B,
(select SEQ1
from TABLE_A
union
select SEQ1
from TABLE_B)C
where
A.SEQ1 = B.SEQ1
and
CCC = '0'
group by A.SEQ1,AAA,BBB
order by A.SEQ1

(CCCはTABLE_Bの項目です)

親TABLE_Aの子TABLE_BにはSEQ1でつながった行が数行あります。
unionを使わない場合、TABLE_Bの行数分だけTABLE_Aの値が繰り返し表示されてしまいます。
上記のような文を組んだのですが、一部繰り返してしまう値が出てしまいました。
SEQ1の値ひとつに対して1行の回答を得る為の文の書き方を教えてください。


引用返信 編集キー/
■15298 / inTopicNo.2)  Re[1]: UNIONの使い方だと思います。
□投稿者/ やじゅ (225回)-(2008/03/10(Mon) 18:47:45)
No15297 (初心者 さん) に返信

MAXとかMINとか使うんでなくて?
引用返信 編集キー/
■15300 / inTopicNo.3)  Re[1]: UNIONの使い方だと思います。
□投稿者/ Jitta on the way (54回)-(2008/03/10(Mon) 19:41:29)
No15297 (初心者 さん) に返信

C の一行を特定していないからだと思います。
A.SEQ1=C.SEQ1 OR B.SEQ1=C.SEQ1
か、LRのないOUTER JOIN じゃないかなぁ?

長いことさわってないのでぁゃιぃ
引用返信 編集キー/
■15307 / inTopicNo.4)  Re[2]: UNIONの使い方だと思います。
□投稿者/ かな (2回)-(2008/03/10(Mon) 23:34:33)
2008/03/10(Mon) 23:38:24 編集(投稿者)
2008/03/10(Mon) 23:38:15 編集(投稿者)

TABLE_A と TABLE_Bがどうすれば1対1の関係になるかですかね。
TABLE_BにSEQ1が同一のデータかつ項目CCCが0のデータが複数件あるのでしょうか?
またはTABLE_AがSEQ1で一意でないか?
今開示されてる情報だと、なんともいえませんが、
TABL_BのBBBを MAXかMINで絞り込むまたは、distinct で重複を排除するか?・・・

ちなみに、↓でも開示されたSQLで取得したレコードと同じようにとれますかね?
久々のSQL ^^;

select A.SEQ1, A.AAA, B.BBB
from TABLE_A as A
inner join TABLE_B as B
on A.SEQ1 = B.SEQ1
and B.CCC = 0

引用返信 編集キー/
■15308 / inTopicNo.5)  Re[3]: UNIONの使い方だと思います。
□投稿者/ 片桐 (75回)-(2008/03/10(Mon) 23:40:27)
片桐 さんの Web サイト
まず、どんなテーブルから、どんな条件でどんなデータを取りたいのか?を整理しませんか?

案外、ややこしい条件や結合を使わなくても解決できるかも、ですよ。
引用返信 編集キー/
■15322 / inTopicNo.6)  Re[2]: UNIONの使い方だと思います。
□投稿者/ 初心者 (54回)-(2008/03/11(Tue) 10:17:35)
No15298 (やじゅ さん) に返信
> ■No15297 (初心者 さん) に返信
>
> MAXとかMINとか使うんでなくて?

お返事ありがとうございます。
私の説明が稚拙で申し訳ありません。
値ではなく行を統合したいので、やはりunionかなと思っています。
引用返信 編集キー/
■15323 / inTopicNo.7)  Re[2]: UNIONの使い方だと思います。
□投稿者/ 初心者 (55回)-(2008/03/11(Tue) 10:19:12)
No15300 (Jitta on the way さん) に返信
> ■No15297 (初心者 さん) に返信
>
> C の一行を特定していないからだと思います。
> A.SEQ1=C.SEQ1 OR B.SEQ1=C.SEQ1
> か、LRのないOUTER JOIN じゃないかなぁ?
>
> 長いことさわってないのでぁゃιぃ

お返事ありがとうございます。
こちらを試してみたのですが、うまくいきませんでした。
引用返信 編集キー/
■15324 / inTopicNo.8)  Re[3]: UNIONの使い方だと思います。
□投稿者/ 初心者 (56回)-(2008/03/11(Tue) 10:31:53)
No15307 (かな さん) に返信
> 2008/03/10(Mon) 23:38:24 編集(投稿者)
> 2008/03/10(Mon) 23:38:15 編集(投稿者)
>
> TABLE_A と TABLE_Bがどうすれば1対1の関係になるかですかね。
> TABLE_BにSEQ1が同一のデータかつ項目CCCが0のデータが複数件あるのでしょうか?
> またはTABLE_AがSEQ1で一意でないか?
> 今開示されてる情報だと、なんともいえませんが、
> TABL_BのBBBを MAXかMINで絞り込むまたは、distinct で重複を排除するか?・・・
>
> ちなみに、↓でも開示されたSQLで取得したレコードと同じようにとれますかね?
> 久々のSQL ^^;
>
> select A.SEQ1, A.AAA, B.BBB
> from TABLE_A as A
> inner join TABLE_B as B
> on A.SEQ1 = B.SEQ1
> and B.CCC = 0
>
返信ありがとうございます。
ご指示の通り、試してみました。
レコードを全てとるという意味では、うまくいきました。
しかし、やはりデータが重複でとれてしまい、TABLE_Aの行がTABLE_Bの行数分繰り返されてしまいました。
ちなみに、テーブル構成はTABLE_AはSEQ1が1行に付き1つずつふってあります。
TABLE_BはSEQ1が同じものが複数行あって、内容によってはCCCが0であったりそうでなかったりしています。

引用返信 編集キー/
■15325 / inTopicNo.9)  Re[4]: UNIONの使い方だと思います。
□投稿者/ 初心者 (57回)-(2008/03/11(Tue) 10:43:20)
No15308 (片桐 さん) に返信
> まず、どんなテーブルから、どんな条件でどんなデータを取りたいのか?を整理しませんか?
>
> 案外、ややこしい条件や結合を使わなくても解決できるかも、ですよ。

返信ありがとうございます。
整理してみます。

[TABLE_A]
SEQ1,AAA,BBB
SEQ1はMAX値+1にて常に違う値がはいっています。
[TABLE_B]
SEQ1,CCC
SEQ1は同じ値が複数行あります。
CCCは同じSEQ1のなかでも'0'とそうでない値があります。
TABLE_BのCCCが'0'のもののTABLE_AのSEQ1,AAA,BBBを取りたいです。
しかし、通常の結合処理の場合には、TABLE_AがTABLE_BのCCCが'0'のものの行数だけ繰り返し取れてしまいます。(最初に書きました文のunionが無い状態)
また、最初に書いた文ですと、TABLE_BにCCCが'0'のものが複数行あった場合、それだけ重複してしまいます。
あくまでTABLE_Aの1行分は1回だけしか取ってこないようにしたいのですが、という説明で趣旨が伝わりますか?
説明が不足していてスイマセンでした。


引用返信 編集キー/
■15326 / inTopicNo.10)  Re[4]: UNIONの使い方だと思います。
□投稿者/ Eternia (1回)-(2008/03/11(Tue) 10:45:08)
> しかし、やはりデータが重複でとれてしまい、TABLE_Aの行がTABLE_Bの行数分繰り返されてしまいました。
> ちなみに、テーブル構成はTABLE_AはSEQ1が1行に付き1つずつふってあります。
> TABLE_BはSEQ1が同じものが複数行あって、内容によってはCCCが0であったりそうでなかったりしています。

テーブルの主キーが何であるかを意識しましょう。
データが重複してとれてしまうということはSEQ1,CCC=0だけでは絞り込めていないということです。
主キーがあるのならその条件を追加したらいいですし、
ないのであればどのデータを優先するのか決めなければなりません。(登録日が新しいほう、とかね。)
その際はやじゅさんの回答のとおりMAXやらMINやら使えばいいですね。

引用返信 編集キー/
■15327 / inTopicNo.11)  Re[3]: UNIONの使い方だと思います。
□投稿者/ やじゅ (228回)-(2008/03/11(Tue) 11:09:17)
No15323 (初心者 さん) に返信

架空のデータでいいので、例を提示していただくと解決しやすいかと。
現状こうなっているデータと、こうしたいデータとかね。
引用返信 編集キー/
■15364 / inTopicNo.12)  Re[4]: UNIONの使い方だと思います。
□投稿者/ 片桐 (78回)-(2008/03/11(Tue) 22:44:47)
片桐 さんの Web サイト
えーと、ようするに、

TABLE_BのCCCに'0'が入っているSEQ1と同じSEQ1を持つTABLE_AのSEQ1とAAAとBBBが取りたい

ですよね?

とすると

SELECT SEQ1,AAA,BBB from TABLE_A where SEQ1 IN (SELECT SEQ1 FROM TABLE_B Where CCC = '0' )

で目的の行が取得できると思います。UNIONもINNER JOIN も不要です。
SQL-Server、Oracle、DB2でも同じSQLです。
引用返信 編集キー/
■15385 / inTopicNo.13)  Re[5]: UNIONの使い方だと思います。
□投稿者/ 初心者 (58回)-(2008/03/12(Wed) 09:14:45)
No15364 (片桐 さん) に返信
> えーと、ようするに、
>
> TABLE_BのCCCに'0'が入っているSEQ1と同じSEQ1を持つTABLE_AのSEQ1とAAAとBBBが取りたい
>
> ですよね?
>
> とすると
>
> SELECT SEQ1,AAA,BBB from TABLE_A where SEQ1 IN (SELECT SEQ1 FROM TABLE_B Where CCC = '0' )
>
> で目的の行が取得できると思います。UNIONもINNER JOIN も不要です。
> SQL-Server、Oracle、DB2でも同じSQLです。

出来ました。
ありがとうございました。
本当に助かりました。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -