ネットが遅くてイライラしてない!?

こんにちわ。

■テーブルA
ID |名称 |
--------------
01 |ああ |
02 |いい |
03 |うう |


■テーブルB
ID |場号1 |番号2
--------------
01 |03 |01
02 |02 |03
03 |03 |02


この2つのテーブルを下記のように結合したいのです。

テーブルB.ID, テーブルB.番号1, テーブルA.名称(番号1より), テーブルB.番号21, テーブルA.名称(番号2より)

つまり、
01 | 03 | うう | 01 | ああ
という形で、

テーブルA.名称(番号1より)または テーブルA.名称(番号2より)
だけであれば参照できるのですが同じテーブルからの2回参照ができません。。

どうかご教授ください。

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

A 回答 (3件)

この手の場合、普通は外部結合しますね(明示的でわかりやすいし)


inner joinでもいいですが、何らかの理由で名称がないことも
想定するとleft joinが妥当でしょう。

SELECT
`テーブルB`.`ID`, `テーブルB`.`番号1`, A1.`名称` , `テーブルB`.`番号2`, A2.`名称`
FROM `テーブルB`
LEFT JOIN `テーブルA` AS A1 ON `テーブルB`.`番号1`=A1.`ID`
LEFT JOIN `テーブルA` AS A2 ON `テーブルB`.`番号2`=A2.`ID`
    • good
    • 2

テーブルAを別名で2つ利用すればいいかと。



ANo.1さんのSQLをアレンジして、
select b.id
b.番号1
a.名称
b.番号2
c.名称
from テーブルA a,
テーブルB b,
テーブルA c
where b.番号1 = a.ID
and b.番号2 = c.ID

かな。

似たような質問がほかにもありましたので詳しくは、
参考URLのANo.4の後半、「次に、1テーブルを別名で結合する件ですが、~」以降を見てください。

参考URL:http://okwave.jp/qa3001981.html
    • good
    • 0

select b.id


b.番号1
a.名称
b.番号2
c.名称
from テーブルA a,
テーブルB b,
(select * from テーブルA) c
where b.番号1 = a.ID
and b.番号2 = c.ID

テスト環境がないから自信なし。
ベンダーによって構文も違うし。
    • good
    • 0

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

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

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

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

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

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q同じテーブルの内容を異なる列として表示する方法

index | id  | param
-------------------
001  | 1  | 犬
001  | 2  | 猫
002  | 1  | 猿
003  | 1  | 雉
003  | 2  | 馬

というようなテーブルがあり、これをSQLで取得した時に、

index | param(id=1) | param(id=2)
----------------------------------
001  | 犬     |  猫
002  | 猿      |
003  | 雉     |  馬

といった結果で取得することは可能でしょうか?

・結果では必ずindexは重複させない。
・idは必ず1か2、もしくはid=2がない。

joinやunionなど試してみましたが、書き方が悪いのか求める結果が得られませんでした。

ご教授いただければと思います。

Aベストアンサー

こんな感じでどうぞ。MAXはSUMなどに置き換えれば他のケースでも応用がききます。

SELECT
[INDEX],
MAX(CASE WHEN ID=1 THEN PARAM END),
MAX(CASE WHEN ID=2 THEN PARAM END)
FROM tbl1
GROUP BY [INDEX]

QOracle10gで1つのSQLで複数回同じテーブルを結合する場合のパ

Oracle10gで1つのSQLで複数回同じテーブルを結合する場合のパフォーマンス向上

Oracleで1つのSQL内で同じテーブルを2回以上結合すると結果出力にかかる時間が非常に遅くなります。
例: SELECT * FROM A, B b1, B b2 WHERE a.id = b1.id AND a.id = b2.id
(テーブルBを2回結合している)

こういう場合にパフォーマンスを落とさない方法はありますか?テンポラリテーブルでテーブルBのレプリカを作成して使用するというのはなしです。あくまで1つのSQLで結果出力できることを前提にパフォーマンスを向上する方法を教えてください。

Aベストアンサー

SELECT * FROM A, B b1, B b2 WHERE a.id = b1.id AND a.id = b2.id
ここの「テーブルBを2回結合している」-> 意味ない。
->
SELECT * FROM A, B b1 WHERE a.id = b1.id → 結果件数同じです。

実行時間テスト。
テーブルA/Bのデータ件数=10000件

******* VISUAL SQLTOOLS - Log ************
14:38:04:890 SQL: SELECT * FROM TEST_TABLE , TEST_TABLE1 b1 , TEST_TABLE1 b2 WHERE TEST_TABLE.id = b1.id AND TEST_TABLE.id = b2.id
->: 10000 件 0.562秒

14:38:05:546 SQL: SELECT * FROM TEST_TABLE , TEST_TABLE1 b1 WHERE TEST_TABLE.id = b1.id
->: 10000 件 0.390秒

14:38:05:984 SQL: SELECT TEST_TABLE.ID FROM TEST_TABLE , TEST_TABLE1 b1 , TEST_TABLE1 b2 WHERE TEST_TABLE.id = b1.id AND TEST_TABLE.id = b2.id
->: 10000 件 0.078秒

14:38:06:125 SQL: SELECT TEST_TABLE.ID FROM TEST_TABLE , TEST_TABLE1 b1 WHERE TEST_TABLE.id = b1.id
->: 10000 件 0.062秒

ご参照ください。

SELECT * FROM A, B b1, B b2 WHERE a.id = b1.id AND a.id = b2.id
ここの「テーブルBを2回結合している」-> 意味ない。
->
SELECT * FROM A, B b1 WHERE a.id = b1.id → 結果件数同じです。

実行時間テスト。
テーブルA/Bのデータ件数=10000件

******* VISUAL SQLTOOLS - Log ************
14:38:04:890 SQL: SELECT * FROM TEST_TABLE , TEST_TABLE1 b1 , TEST_TABLE1 b2 WHERE TEST_TABLE.id = b1.id AND TEST_TABLE.id = b2.id
->: 10000 件 0.562秒

14:38:05:546 SQL: SELECT * FROM TEST_TABLE , T...続きを読む

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.年月 = 任意の値

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

QLEFT JOINが2つあるSQL文でANDの意味

■下記SQL文の意味を教えてください

SELECT a.*, b.being_name
FROM alive a
 LEFT JOIN being b ON a.hoge_id = b.id
 LEFT JOIN call c ON c.call_id = a.hoge_id
  AND f.hoge_id = 12
 WHERE f.hoge_id = 12 OR b.id = 12

※12の部分は動的に切り替わります

・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか?
・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか?

>SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2
>「AND」は2つの条件式の論理積
・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

■下記SQL文の意味を教えてください

SELECT a.*, b.being_name
FROM alive a
 LEFT JOIN being b ON a.hoge_id = b.id
 LEFT JOIN call c ON c.call_id = a.hoge_id
  AND f.hoge_id = 12
 WHERE f.hoge_id = 12 OR b.id = 12

※12の部分は動的に切り替わります

・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか?
・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか?

>SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式...続きを読む

Aベストアンサー

>・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか?
はいそうです。

>左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか?
はいそうです。(alive→beingって言うような意味です。)

>・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか?
「AND]は「WHERE」にかかっているのではなく「LEFT 」の結合の条件となります。
SELECT a.*, b.being_name
FROM alive a
LEFT JOIN being b ON a.hoge_id = b.id
LEFT JOIN call c ON (c.call_id = a.hoge_id AND f.hoge_id = 12)
WHERE f.hoge_id = 12 OR b.id = 12

<<追記>>
このSQLにはfというテーブルが存在しないのでエラーとなります。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Q2つのテーブルから条件に一致しないデータ抽出

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンター
------------------------------------------

条件は、マスターテーブルの店コードが店コードテーブルに存在
しないデータのみ抽出です。

抽出結果は、以下の様にしたいです。
1、あ、い、6
2、う、え、8

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

わかりずらい質問ですがよろしくお願いします。

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンタ...続きを読む

Aベストアンサー

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S.店コード
where S.店コード is null

または、
SELECT *
FROM マスターテーブル as M
where M.店コード not in ( select 店コード from 店コードテーブル)

等でいけるでしょう。

ただ、参考URLにもありますように、
is null とか not in は遅いです。(Indexで見れなくなるので)
大量データを扱うような場合や、速度が求められるような場合は
別途クエリを検討しましょう。

参考URL:http://www.geocities.jp/mickindex/database/db_optimize.html

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S....続きを読む

QGROUP BYを行った後に結合したい。

oracle8iを使用しています。
2つのテーブルを結合したいと思っていますが、
テーブル構成が、N対Nのテーブルのため、
片方をグループ化したあとに結合させようと思っています。

ところが、単純にGroup byを使うと、結合した後に
グループ化してしまうために、期待した値がひょうじされません。

なんとか、1回のSQLで正しく情報をとることはできないものでしょうか。

Aベストアンサー

>テーブル構成が、N対Nのテーブルのため、
>片方をグループ化したあとに結合させようと思っています。

多分こんな形ではどうですか?

SELECT A.KEY,B.KEY,
FROM TABLE_A A
,(SELECT KEY FROM TABLE_B
GROUP BY KEY) B
WHERE A.KEY=B.KEY;

要はFROM句にテーブル名ではなく、SELECT~GROUP BYを書く。

Q2つの項目が重複するレコードを抽出する方法はありますか?

MySQL4.1で既存データに対し複合キーを新しく設定したいのですが、

ALTER TABLE `test` ADD PRIMARY KEY (`a`,`b`)

としても重複データが存在する為、作成できませんでした。

10万件あるテーブルから重複するレコードを手動で削除したいのですが、aとbが重複しているレコードだけ抽出するSQL文はありますでしょうか?

Aベストアンサー

select * from `test`
where (a,b) in(
select a,b from `test`
group by a,b
having count(*)>1)

Q同じ表を複数回結合する場合

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

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

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



 

Aベストアンサー

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

例) ----------------------------------
SELECT
名前, k1.県名 as 出身県, k2.県名 as 現住所
FROM
人名表 p
left join 県名マスター k1 on p.出身県 = k1.コード
left join 県名マスター k2 on p.現住所 = k2.コード;
-------------------------------------


人気Q&Aランキング