
SQL勉強中の者です。このSQL文の意味を教えてください。
SELECT A.*
FROM table AS A, table AS B
WHERE A.id *= B.id
AND A.flag = 1
tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。
分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか?
あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
= は内部結合の符号、*= あるいは =* は外部結合の符号です。
Aのテーブルにあるレコードをすべて返します。
テーブルAにidがあり、そのidがBにないレコード状態にして、
SELECTリストにBのカラムも含めてSQLを流すと違いがわかると思います。
外部結合の書き方はこれだけではありませんが、
RDBMSにより使えるものが異なります。
回答ありがとうございます。
外部結合の符号なのですね。調べても見つからなかったので助かりました。外部結合を調べると「JOIN」というのがあるのですが、何が違うのか分かりませんでした。RDBMSによって使い分けるのでしょうか?
No.3
- 回答日時:
id が一意であれば、やはり意味がありません。
Aでid=1ならBでもid=1で、しかも一意なので1レコードしか該当
しません。それでいて、flagが1でもあり、0でもあると言うのは
絶対にあり得ない条件です。
もし、idが一意でない場合はflagが0と1の両方を持つという意味で
考えられる条件ではあります。しかし、そういう抽出条件ならば、
他に書きようがあり、この方法は少し違和感があります。
経験から見ると、SyBaseのエンジンはスマートなほうで、あまり
効率化を意識しなくても良いのですが、有名な○○○○では
こういう書き方は速度の劣化を招きます。
SELECT A.* FROM (SELECT * FROM table WHERE flag=1) A,
(SELECT id FROM table WHERE flag=0 GROUP BY id) B
WHERE A.id=B.id
このように条件を絞ったクエリ(レコード数が少ない)同士を結合
させる方が一般に高速です。
再度の回答ありがとうございます。
idは一意でないので、ありえる条件ということですね。
教えていただいたSQL文も参考になりました。
重ねて御礼申し上げます。
No.2
- 回答日時:
SyBaseでしょうか?
結論から申しますと、意味の無い結合条件です。
「A.id *= B.id」とは「AにあればBに無くてもよい」と言う意味です。
A:Bが有:有、有:無なら対象、無:有は対象外ということです。
しかし、AとBは同じテーブルなので、有:無になることはありません。
意味があるのは「A.flag = 1」という条件だけです。
但し、同じテーブル同士を結合する例は結構でてきます。だから、
「同じテーブル同士を結合することは意味が無い」と決め付けない
でください。ベテランと言われるSEの中にも同じテーブル同士を
結合させると言う発想ができない人がかなりいます。
回答ありがとうございます。
すみません、書き忘れました。SyBaseです。しかも、条件が抜けていました。もう1行
AND B.flag = 0
がありました。これがあれば意味のない結合条件ということではなくなりますか?
同じテーブル同士を結合している例を初めて見たのですが、結構あるものなのですね。マスターできるように頑張ります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マイクラPC版のコマンドで効率...
-
エクセルの関数について教えて...
-
行数の取得
-
MySQL5.5 viewの処理速度改善に...
-
Mysql でレコードを追加した時...
-
埼玉県の中央部の方!!
-
テーブルの結合について
-
'id'を無視して、外部ファイル...
-
タグを記録したテーブルの書き...
-
データの連番
-
クリアエステヴェールについて
-
MyISAMからMEMORYに変換した場...
-
主キーレコードを削除する場合
-
355番356番357番がわかりません...
-
SQLで、アクセス集計について困...
-
どちらのアクセを買おうか迷っ...
-
時間毎に単価が変わるログの集...
-
リスト作成
-
ペキニーズのブリーダー又はシ...
-
『教えてgoo』を退会するには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
select文のwhere句に配列を入れ...
-
VIEWの元のテーブルのindexって...
-
エラー 1068 (42000): 複数の主...
-
SQLにて特定の文字を除いた検索...
-
【Transact-sql】 execの結果を...
-
マイクラPC版のコマンドで効率...
-
SQL Left Join で重複を排除す...
-
sqlで、600行あるテーブルを100...
-
複数テーブルのGROUP BY の使い...
-
WordpressのContact form 7でzi...
-
クエリ表示と、ADOで抽出したレ...
-
SQLサーバから、項目の属性(型...
-
selectした大量データをinsert...
-
Access パラメータクエリをcsv...
-
副問合せの書き方について
-
inner joinをすると数がおかし...
-
insertを高速化させたい
-
[MySQL] 3つのテーブルの結合で...
おすすめ情報