以下のような二つのテーブルがあります。

社員テーブル
社員番号 社員氏名
1     花子
2     太郎

所属テーブル
社員番号 所属番号
1     10
1     20
2     30

欲しいのは以下の結果です。
1 花子
2 太郎

以下のSQLを実行すると、
SELECT distinct a.社員番号, a.社員氏名, b.所属番号
FROM 社員 a,所属 b
where a.社員番号 = b.社員番号
order by 所属番号

1 花子
1 花子
2 太郎

となってしまいます。
先に述べたとおりの結果を取得するにはどういうSQLを書いたらいいでしょうか?
お知恵を貸してください。宜しくお願いします。
Oracle8iを使用しています。
  

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

A 回答 (4件)

>欲しい結果は、所属番号でソート


成るほど、分りました。
その場合は、どちらの所属番号でソートするのか決める必要があります。
例では花子の所属番号が両方とも太郎よりも若くなっていますが、もし太郎の番号が花子の番号の間に来たらどうしますか?
例えば所属番号が複数ある場合は大きい方を取る、という決まりにするなら

SELECT 社員番号, Max(所属番号) as 所属番号の最大
FROM 所属テーブル
GROUP BY 社員番号;

とかで社員番号に対応する所属番号をひとつにして、これと社員テーブルを連結して「所属番号の最大」でソートしたらどうでしょうか。
    • good
    • 0
この回答へのお礼

なるほど、Maxで抽出してから・・ですね。
それなら思った通りの結果が返ってきます。
考え方を変える、というのがなかなか出来なくて。
参考になりました。どうもありがとうございました♪

お礼日時:2002/02/12 12:43

所属テーブルのデータを拝見するに、「花子」さんが所属に2つありますね。



所属テーブルとの結合により「花子」さんが2回(計3つ)が表示されています。

ORDER BY で所属番号順にする必要があるならばルールが必要でしょう。
(どれをソート用の所属とするか)

この回答への補足

回答ありがとうございます。
社員番号に対して所属は常に1対1では無いので、
所属の重複は避けられないんです。
ただし、今回は社員の重複無しで、
なおかつ所属でソートする必要があるのでお知恵をお借りしたい次第です。
また何か案がありましたら教えてください。

補足日時:2002/02/08 21:32
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
また何かありましたらよろしくお願いします。

お礼日時:2002/02/12 12:49

ご質問のSQLを実行した結果は、



1 花子 10
1 花子 20
2 太郎 30  だと思います。

SELECT distinct a.社員番号, a.社員氏名
FROM 社員 a,所属 b
where a.社員番号 = b.社員番号

にすれば、期待の結果が得られると思います。

この回答への補足

回答ありがとうございます。
すみません、私の説明が悪かったですね。
確かに私の書いたSQLの結果は
1 花子 10
1 花子 20
2 太郎 30  
です。
そして、欲しい結果は、所属番号でソートされた
1 花子 10
2 太郎 30 
という結果です。
つまり、社員番号での重複を避けたいのです。
また何かありましたら教えてください。 

補足日時:2002/02/08 21:29
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
また何かありましたらよろしくお願いします。

お礼日時:2002/02/12 12:47

Distinct は使いたくないのですか?



SELECT DISTINCT ~
と書いてやってみてください。

ただ、パフォーマンスは悪くなります。

この回答への補足

回答ありがとうございます。
DISTINCTを使っても重複するのです。
所属コードが違うから当然なんですが・・。
そこをお知恵を借りてなんとかできないかと、思ったのですが・・。
また何かあれば教えてください。

補足日時:2002/02/08 21:27
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
また何かありましたらよろしくお願いします。

お礼日時:2002/02/12 12:45

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

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

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

QMs Access テーブルBにテーブルAのCDを充てたい。(クエリ?紐づけ?リレーションシップ?)

初心者です。よろしくお願いします。
そもそも、できるのかどうか、できたとして、どうするのかがわからないです。

次の2つのテーブルがあります。
テーブルマスタA には、①市町村CD ②市町村名 ③住所(番地なし)
テーブル受付データB には、①NO ②住所(番地まであり)③受付日 ④⑤・・・

具体的には、以下のとおり。(サンプル)
テーブルマスタA
①    ②      ③
10000  松戸市    千葉県松戸市
20000  鎌ケ谷市本町 千葉県鎌ケ谷市本町
30000  横須賀市   神奈川県横須賀市
テーブル受付データB
①    ②
1    千葉県松戸市五香5-5-5    
2    千葉県鎌ケ谷市本町さくらがおか8-88-8 ひまわりアパート302
3    神奈川県横須賀市横須賀8-7-8   

テーブル受付データBにおいて、②の部分(市町名まで)と、
テーブルマスタAの③をなんとか紐づけて、

クエリで合体させたい。
=テーブル受付データBに、テーブルマスタAの市町村CDを充てたい。
A①市町村CD  A②市町村名 B② B③ B④ B⑤
とすることを切望しています。

***********
たとえば、2つのテーブルに同じフィールドがあって、
それをリレーションシップで紐づけるのは容易ですが、
今回のようなパターンは、
もしかして、私は、ナンセンスなことをしようと苦闘している?と思ってきました。
フィールド名が同じじゃないのに、それを紐づけることができるのでしょうか?

できるとして、どのようにすればよいのでしょうか?

どうぞ、教えていただきたく、お願いいたします!!!

初心者です。よろしくお願いします。
そもそも、できるのかどうか、できたとして、どうするのかがわからないです。

次の2つのテーブルがあります。
テーブルマスタA には、①市町村CD ②市町村名 ③住所(番地なし)
テーブル受付データB には、①NO ②住所(番地まであり)③受付日 ④⑤・・・

具体的には、以下のとおり。(サンプル)
テーブルマスタA
①    ②      ③
10000  松戸市    千葉県松戸市
20000  鎌ケ谷市本町 千葉県鎌ケ谷市本町
30000  横須賀市   神奈川県横...続きを読む

Aベストアンサー

パラメータが表示されたのは指定したフィールドがないからです。
テーブル名とフィールド名を使用している名前に変更してください。

InStr関数は
ある文字列 (string1) の中から指定された文字列 (string2) を検索し、最初に見つかった文字位置を返す文字列処理関数です。
InStr(string1, string2)

やっていることはテーブル受付データBの②(住所)の中からテーブルマスタAの③(住所)を検索し
文字列がある位置を出しています。
必要なのは文字列が含まれているデータのみなので条件を>0としています。

試しにInStrの部分をなくしてクエリを実行してみてください。
「テーブルマスタA」のレコード数*「テーブル受付データB」のレコード数のデータが表示されるはずです。

QACCESS ACCESS VBA テーブル テーブル変換 番号 個数 変換

私はプログラム初心者です。
業務の中でACCESSを使っております。
ACCESSでテーブルの変換についてのプログラムが分からなかったので
質問させて頂きました。


以下のようなテーブル(テーブル1)があります。
管理番号|NO|名前
1|NO.1|スプーン
2|NO.2|スプーン
3|NO.3|スプーン
4|NO.1|フォーク
5|NO.2|フォーク
6|""|ナイフ
7|NO.1|お鍋
以上のテーブルを新たにテーブル(テーブル2)を作成し、次のようなにしたいです。
管理番号|台数|名前
1|3|スプーン
4|2|フォーク
6|1|ナイフ
7|1|お鍋

テーブル変換の機能
・名前が同じ物の個数を表示する
・名前が同じ物の管理番号は若い番号にする

よろしくお願いいたします。

Aベストアンサー

Access2003でのクエリ作成手順になります。(他バージョンでもほぼ同じでしょう)

・「デザインビューでクエリを作成する」から対象のテーブルを表示させます。

・クエリデザインツールバーにある「Σ」をクリックします。
 (デザインの欄に「集計」が追加されます)

 もしくは、クエリの種類を1度「クロス集計」にし、「選択」に戻しても同じ状態になります。

・テーブル内の「管理番号」をダブルクリックします。
 フィールドに「管理番号」、テーブルに対象テーブル名、集計に「グループ化」が表示されます。
 集計のところを「最小」に変更します。
 並べ替えのところを「昇順」に変更します。

・テーブル内の「NO」をダブルクリックします。
 フィールドに「NO」、テーブルに対象テーブル名、集計に「グループ化」が表示されます。
 集計のところを「カウント」に変更します。

・テーブル内の「名前」をダブルクリックします。
 フィールドに「名前」、テーブルに対象テーブル名、集計に「グループ化」が表示されます。

・ここで、表示を「データシートビュー」に切り替えます。(注1)
 管理番号の最小、NOのカウント、名前 の表が表示されます。
 名前「ナイフ」部分のカウントが得たいものではなく「0」になっています。
 これは、NULLのデータはカウント対象外となっているためです。

・表示を「SQLビュー」に切り替えます。
 1行目中ほどに 「 Count(テーブル名.[NO]) AS NOのカウント, 」があります。
 NOに限定した個数を求めるのでなく、単にレコード数を得たいので
 これを 「 Count(*) AS 台数, 」に書き換えます。
 XXXXX AS YYYY は、XXXXXをYYYY名で、という意味合いになるので、
 同様に「管理番号の最小」->「管理番号」に修正します。

・表示を「データシートビュー」に切り替えます。

これで求めたいクエリは作成することができました。
このクエリをそのまま使うのではなく、結果をテーブルに書き出すには続いて以下を行います。

・表示を「クエリ デザイン」に切り替えます。

・メニューの「クエリ」->「テーブル作成」をクリックします。
 テーブル名を入力し、「OK」

 クエリデザイン上変化はありませんが、以上で終了です。

確認)
表示を「SQLビュー」に切り替えます。
1行目最後あたりに、「 INTO テーブル名 」が追加されています。
これが結果をテーブルに書き出す命令部分になります。


(注1)
「'*'で選択したフィールドはグループ化できません。」というメッセージが出たら、クエリ作成をいったんあきらめます。
(クエリデザインの画面を閉じます)
メニューの「ツール」->「オプション」の「テーブル/クエリ」タブの「クエリ デザイン」部分の「全てのフィールドを表示する」チェックを外し「OK」します。
クエリ作成を初めからやり直します。

(注2)
(注1)の変更は、以降も変更されたままとなるので、今回だけ回避するには、
表示を「SQLビュー」にし、1行目最後の「 テーブル名.名前, * 」の「 , * 」を削除します。


書く練習がてら、初心者向けに書いてみましたがいかがでしたでしょうか。

Access2003でのクエリ作成手順になります。(他バージョンでもほぼ同じでしょう)

・「デザインビューでクエリを作成する」から対象のテーブルを表示させます。

・クエリデザインツールバーにある「Σ」をクリックします。
 (デザインの欄に「集計」が追加されます)

 もしくは、クエリの種類を1度「クロス集計」にし、「選択」に戻しても同じ状態になります。

・テーブル内の「管理番号」をダブルクリックします。
 フィールドに「管理番号」、テーブルに対象テーブル名、集計に「グループ化」...続きを読む

QテーブルA、Bで、項目の重複の有無確認をしたい

CSVファイルからレコードをインポートしたテーブルAがあります。
インポートした後に処理済みレコードを累積収納するテーブルBがあります。
インポート後、テーブルAのレコードをもとに処理してCSVファイルをエクスポートして、処理済みレコードをテーブルBに移しています。
テーブルA、同Bには「日付」項目があります。

テーブルAにインポート後、処理を実行する際に、テーブルBの日付とテーブルAの日付の重複がないことを比較チェックし、もし重複があればメッセージを出して処理を中断させたいのです。


If~Then~Else、IsNull、DLoolup関数を使って試みましたが、うまくいきません。
VBAでどのような記述をすればいいでしょうか?

Aベストアンサー

dcount("日付","テーブルA","日付 in(select 日付 from テーブルB")
とか?

Q2つのテーブルAとBをマージして新しいテーブルCを作成したいのです。

2つのテーブルAとBをマージして新しいテーブルCを作成したいのです。マージするときは、最新の売上日フィールドをもつレコードを取得します。環境はAccess2000です。どんなSQL文を作成すればいいのでしょうか? 
また、テーブルAにしかないレコード、又はテーブルBにしかないレコードは、そのままテーブルCに追加したいです。
※下記テーブルAとBは、Access内に存在します。テーブルCはAとBのマージ後の結果作成されるテーブルです。

テーブルA
顧客番号   売上日   商品名   備考
   1  2000-01-01  ふでばこ   A
   2  2000-02-02  鉛筆     A
   3  2000-03-03  定規     A
   4  2000-04-04  シャーペン  A
  99  2000-09-09  パソコン   A

テーブルB
顧客番号   売上日   商品名   備考
   4  2001-04-04  シャーペン  B
   2  2000-02-02  鉛筆     B
   3  2001-03-03  定規     B
   1  1999-01-01  ふでばこ   B
 100  2005-11-11  ワープロ   B


テーブルAとBを、最新の売上日の条件でレコードを取得し新しいテーブルCを作成する。

テーブルC
顧客番号   売上日   商品名   備考
   1  2000-01-01  ふでばこ   A
   2  2000-02-02  鉛筆     A
   3  2001-03-03  定規     B
   4  2000-04-04  シャーペン  A
  99  2000-09-09  パソコン   A
 100  2005-11-11  ワープロ   B

SQL文で処理可能なのでしょうか?

2つのテーブルAとBをマージして新しいテーブルCを作成したいのです。マージするときは、最新の売上日フィールドをもつレコードを取得します。環境はAccess2000です。どんなSQL文を作成すればいいのでしょうか? 
また、テーブルAにしかないレコード、又はテーブルBにしかないレコードは、そのままテーブルCに追加したいです。
※下記テーブルAとBは、Access内に存在します。テーブルCはAとBのマージ後の結果作成されるテーブルです。

テーブルA
顧客番号   売上日   ...続きを読む

Aベストアンサー

サブクエリでネストしても出来ない処理があるのでクエリを分けた方が簡単ですよ。
単純にするなら3つ

'qry1として
SELECT テーブルA.顧客番号, テーブルA.売上日, テーブルA.商品名, テーブルA.備考
FROM テーブルA
UNION SELECT テーブルB.顧客番号, テーブルB.売上日, テーブルB.商品名, テーブルB.備考
FROM テーブルB;

'qry2として
SELECT qry1.顧客番号, Max(qry1.売上日) AS 売上日の最大, qry1.商品名
FROM qry1
GROUP BY qry1.顧客番号, qry1.商品名;

'qry3として
'テーブルCを作成するなら
SELECT qry2.顧客番号, qry2.売上日の最大 AS 売上日, qry2.商品名, qry1.備考 INTO テーブルC
FROM qry2 INNER JOIN qry1 ON (qry2.売上日の最大 = qry1.売上日) AND (qry2.顧客番号 = qry1.顧客番号)
GROUP BY qry2.顧客番号, qry2.売上日の最大, qry2.商品名, qry1.備考;

'既存のテーブルCに追加するならこちらで
INSERT INTO テーブルC ( 顧客番号, 売上日, 商品名, 備考 )
SELECT qry2.顧客番号, qry2.売上日の最大, qry2.商品名, qry1.備考
FROM qry2 INNER JOIN qry1 ON (qry2.売上日の最大 = qry1.売上日) AND (qry2.顧客番号 = qry1.顧客番号)
GROUP BY qry2.顧客番号, qry2.売上日の最大, qry2.商品名, qry1.備考;

サブクエリで処理できるところもありますがその辺はご自分でネストしてみてください。

サブクエリでネストしても出来ない処理があるのでクエリを分けた方が簡単ですよ。
単純にするなら3つ

'qry1として
SELECT テーブルA.顧客番号, テーブルA.売上日, テーブルA.商品名, テーブルA.備考
FROM テーブルA
UNION SELECT テーブルB.顧客番号, テーブルB.売上日, テーブルB.商品名, テーブルB.備考
FROM テーブルB;

'qry2として
SELECT qry1.顧客番号, Max(qry1.売上日) AS 売上日の最大, qry1.商品名
FROM qry1
GROUP BY qry1.顧客番号, qry1.商品名;

'qry3として
'テーブルCを作成す...続きを読む

Qoracle9i distinct

select distinct 1 as aaa, bbb
from table_a

aaa     bbb
--------------------------
1      a
1      b
1      c

この場合の「distinct 1」というのは
table_aの1列目でdistinctするという
意味でいいのでしょうか?
でもdistinct 2
とすると、aaaの列の値が2になるだけなのですが・・。
すみませんがdistinct 1 の意味を教えていただけますでしょうか。

Aベストアンサー

>この場合の「distinct 1」というのは
>table_aの1列目でdistinctするという
>意味でいいのでしょうか?

>すみませんがdistinct 1 の意味を教えていただけますでしょうか。

distinct 1 に意味はありません。
1 as aaa
の方です。

selectして取り出す結果は、テーブル中の値や、それを加工したものでなくてもかまいません。
今回の場合では、"1"という固定の値を、1列目に出力してというSQLになります。
as aaaは、その列の名前をaaaにしてという意味です。

そのため、2に変えればaaaが2になります。

distinctの意味は分かりますか?


人気Q&Aランキング

おすすめ情報