人に聞けない痔の悩み、これでスッキリ >>

例えば、名前、出身県、現住所 のような表があります。
出身県と現住所は県名マスターを参照したいのですが、

select (名前、 県名マスター.県名 as 出身県、 県名マスター.県名 as 現住所 from
人名表 p left join 県名マスター k on p.出身県 = k.コード) left join 県名マスター on p.現住所 = k.コード;

としたのですが、出身県も現住所も同じになってしまいます。
どのような結合が良いのでしょうか?



 

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

A 回答 (1件)

複数結合したいテーブルに異なる別名を付けて結合すれば良いかと。



例) ----------------------------------
SELECT
名前, k1.県名 as 出身県, k2.県名 as 現住所
FROM
人名表 p
left join 県名マスター k1 on p.出身県 = k1.コード
left join 県名マスター k2 on p.現住所 = k2.コード;
-------------------------------------
    • good
    • 1
この回答へのお礼

うまくいきました。
ありがとうございました。

お礼日時:2011/06/30 02:52

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

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

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

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

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

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

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Q1つのテーブルに同じデータを参照する複数の列がある場合…

うまく説明できないのですが、

テーブル1   テーブル2
No|名前    ID|午前担当|午後担当
――――  ――――――――――
01|Aさん   01|     1|     2
02|Bさん   02|     3|     4
03|Cさん   03|     5|     1
04|Dさん   04|     2|     3
05|Eさん   05|     4|     5

上の2つのテーブルを結合させて、

結合後テーブル
No|午前担当|午後担当
――――――――――
01|  Aさん|  Bさん
02|  Cさん|  Dさん
03|  Eさん|  Aさん
04|  Bさん|  Cさん
05|  Dさん|  Eさん

上のように表示させたいのですが、
どのように結合したらよいのでしょうか?

どうぞ、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

>どのように結合したらよいのでしょうか?
テーブル2に対してテーブル1を2つ結合させれば出来ます。
下記ではテーブル1を2回結合させるためテーブル1とテーブル1_1として結合させています。

SELECT テーブル2.ID, (テーブル1.名前) AS 午前担当, (テーブル1_1.名前) AS 午後担当
FROM (テーブル2 LEFT JOIN テーブル1 ON テーブル2.午前担当 = テーブル1.[No]) LEFT JOIN テーブル1 AS テーブル1_1 ON テーブル2.午後担当 = テーブル1_1.[No]
ORDER BY テーブル2.ID;

INNER JOINを使うとテーブル2の午前・午後担当フィールドにNullがあった場合表示されないのでLEFT JOINとしてNullの場合も表示させるよう対応しています。
Nullは絶対ないという場合ならLEFT JOINをINNER JOINとしても大丈夫です。
これで出来ます。

Qpostgres 外部結合(AからB、BからC)

postgresの外部結合で質問です。

テーブルを複数外部結合する場合、
A(左)B(右)、
A(左) C(右)と外部結合する場合のSQLはよく載っているのですが
A(左)B(右)で外部結合、
そしてさらに
B(左)C(右)の外部結合のSQL例がなかなか載っておらず、見つけれません。
どなたか教えてください。

Aベストアンサー

じゃぁ
SELECT a.*, b.*, c.* FROM a LEFT JOIN b ON a.key = b.key LEFT JOIN c ON b.key2 = c.key2;

でいいんじゃ

QJOINで複数の表をまとめる場合の書き方

質問させてください。
SQLのJOINで複数の表をまとめる場合、以下のどちらの方法が一般的でしょうか。

A, B, C : 表
X, Y : 条件

表ごとにくぎる
(A INNER JOIN B ON X) INNER JOIN C ON Y

条件ごとにくぎる
A INNER JOIN B INNER JOIN C ON Y ON X

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

Aベストアンサー

表ごとにくぎる
(A INNER JOIN B ON X) INNER JOIN C ON Y

が一般的です。

条件ごとにくぎる
A INNER JOIN B INNER JOIN C ON Y ON X
のはエラーにならなくても分かりにくくなるのでバグの元。
だいたい、こう書くなら
A INNER JOIN B INNER JOIN C where Y and X
って書いたほうがまだ分かりやすいと思うし、
それをいうなら普通は、
from A,B,C where Y and X
と書くでしょう。
## 外部結合の場合は最後の書き方ができない(かできるけどANSI標準でない)とかありますけど。

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Q複数の条件での絞り込み検索の仕方

PostgreSQLで複数の条件での絞り込み検索をしたいのです。

テーブルには
発売日、商品名、入荷日
があります。
例えば
発売日が2007年5月1日から5月5日で、商品名に「○○」もしくは「××」もしくは「△△」が含まれており、入荷日が一番新しいもの
という条件で検索したいのです。

発売日だけの絞込みならBetweenですし、商品名だけならor、入荷日の最新だったらmaxを使えば個別には検索できるのですが、これをまとめて一行でやるにはどうしたらよいのかわかりません。
それぞれでandでつなげてみましたが、orの条件がうまく反映されず、一個目の○○だけが検索に引っかかってる状態です。
××や△△もひっかかるようにするにはどう記述したらよいのでしょうか。

Aベストアンサー

データ件数がどのくらいあるのかは分かりませんが、ユニークなキーもなく、likeの任意一致をorでつなぐという方法は、性能を出せませんよ?

select *
from t1
where 入荷日 in(
select max(入荷日)
from t1
where 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')
)
and 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')

Qdate型でのbetweenについて教えてください。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date '2007-12-01' and date '2008-01-01'
にすると2007-12-31が該当するのですが、
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'
では2007-12-31のレコードは該当しないものでしょうか??

select * from test where num between 10 and 100
とした場合では、num が 10 ~ 100 のものが問い合わされますよね??
date型になるとこうならないのでしょうか??

よろしくお願いします。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date...続きを読む

Aベストアンサー

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

●時間だけを多少進めたデータを追加してみました

farm=# insert into testtbl6 values('2007-12-31 01:00:00');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
2007-12-31 01:00:00
(2 rows)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '200
7-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

よって、あなたのDBに登録してあるデータは、2007-12-31と午前0時を少し回っているデータが登録されているため、
検索でヒットしないのではないのでしょうか?

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 ...続きを読む

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Qleft join が3つ以上のとき

例えば

select * from
((t1 left join t2 on t1.a=t2.a)left join t3 on t1.a=t3.a)
where b.t1='y';

という風にカッコがついて記入しにくくなります。
4つの場合はさらに深刻です。
簡単な記法はないのでしょうか?

Aベストアンサー

今回の例では、元々括弧を使う必要はないので、不必要な括弧を書かないようにすればいいのでは?

また、クエリを部分的にビューにしてしまえば、SQLは簡潔にできます。

Q複数行の結果を単一列に連結

以下のような【TABLE1】と【TABLE2】をID_SUBの列で結合した結果を
【A.結果】のように取得したいのですがうまくいきません。

【TABLE1】
ID ID_SUB
1 A1
2 B1

【TABLE2】
ID ID_SUB ID_SUB_CODE
1 A1 AAA1
2 A1 AAA2
3 B1 BBB1
4 B1 BBB2

【A.結果】
ID_SUB ID_SUB_CODE
A1 "AAA1,AAA2"
B1 "BBB1,BBB2"

いろいろ調べたのですが、MySQLにはGROUP_CONCATの
関数を使うと簡単に出来るみたいですが、PostgreSQLには
似たような関数がなく、ARRAYが使えるかな?と思ってためしてみましたが

array_to_string(ARRAY(ID_SUB_CODE, ','))

等のような感じで試した結果、ID_SUB_CODEが
全て連結されるような使い方しか出来ませんでした。

A1 "AAA1,AAA2,BBB1,BBB2"
B1 "AAA1,AAA2,BBB1,BBB2"

何か良い方法はありますでしょうか?

以下のような【TABLE1】と【TABLE2】をID_SUBの列で結合した結果を
【A.結果】のように取得したいのですがうまくいきません。

【TABLE1】
ID ID_SUB
1 A1
2 B1

【TABLE2】
ID ID_SUB ID_SUB_CODE
1 A1 AAA1
2 A1 AAA2
3 B1 BBB1
4 B1 BBB2

【A.結果】
ID_SUB ID_SUB_CODE
A1 "AAA1,AAA2"
B1 "BBB1,BBB2"

いろいろ調べたのですが、MySQLにはGROUP_CONCATの
関数を使うと簡単に出来るみたいですが、PostgreSQLには
似たような関数がなく、ARRAYが使え...続きを読む

Aベストアンサー

select id_sub,
( select array_to_string(ARRAY(select id_sub_code from table2
where table1.id_sub=table2.id_sub ), ',') )
from table1;

なんて参考になりませんか。


人気Q&Aランキング