• ベストアンサー
  • 困ってます

このSQL文の意味を教えてください。

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つ並べている意味がよく分かりません。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数273
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

= は内部結合の符号、*= あるいは =* は外部結合の符号です。 Aのテーブルにあるレコードをすべて返します。 テーブルAにidがあり、そのidがBにないレコード状態にして、 SELECTリストにBのカラムも含めてSQLを流すと違いがわかると思います。 外部結合の書き方はこれだけではありませんが、 RDBMSにより使えるものが異なります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 外部結合の符号なのですね。調べても見つからなかったので助かりました。外部結合を調べると「JOIN」というのがあるのですが、何が違うのか分かりませんでした。RDBMSによって使い分けるのでしょうか?

関連するQ&A

  • SQL WHERE文のノットイコールについて

    初歩的な質問ですみません。 Oracle9iでsqlplusで接続しています。 「member_accountテーブルのdelete_flag(VARCHAR2)カラムの値が'1'ではない」ものを抽出したいと考えてます。 ただ、正しい結果が返ってきません。 何が問題でしょうか?よろしくお願いいたします。 ============================================================ SQL> select count(ID) from member_account; COUNT(ID) ---------- 16450 SQL> SQL> select count(ID) from member_account where delete_flag='1'; COUNT(ID) ---------- 107 SQL> SQL> select count(ID) from member_account where delete_flag<>'1'; COUNT(ID) ---------- 0 SQL> SQL> select count(ID) from member_account where delete_flag!='1'; COUNT(ID) ---------- 0 ============================================================ よろしくお願いいたします。

  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • SQLの結合条件について

    SQLの結合条件について ・table_A ID | ATAI 01 | AAA 01 | XXX 02 | ABC 03 | DEF table_B ID | ATAI 01 | 不要 02 | 必要 03 | 必要 04 | 不要 上記のようなテーブルAとBがあるとします。 やりたいこと 1.テーブルAに存在するIDをBのIDから抽出 2.テーブルAの「ATAI」の値が’AAA’のIDは抽出対象から外す。 ※テーブルAの01IDに’AAA’と’XXX’がありますが、Bの抽出対象から外したい。 2.がうまくいきません。 select B.ID from table_A A,table_B B where A.ID = B.ID 上記のSQLに2.の条件を足して、結果を02と03にしたいです。 ※CASEは使わずにお願いします。

その他の回答 (2)

  • 回答No.3
  • nda23
  • ベストアンサー率55% (773/1384)

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
  • nda23
  • ベストアンサー率55% (773/1384)

SyBaseでしょうか? 結論から申しますと、意味の無い結合条件です。 「A.id *= B.id」とは「AにあればBに無くてもよい」と言う意味です。 A:Bが有:有、有:無なら対象、無:有は対象外ということです。 しかし、AとBは同じテーブルなので、有:無になることはありません。 意味があるのは「A.flag = 1」という条件だけです。 但し、同じテーブル同士を結合する例は結構でてきます。だから、 「同じテーブル同士を結合することは意味が無い」と決め付けない でください。ベテランと言われるSEの中にも同じテーブル同士を 結合させると言う発想ができない人がかなりいます。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 すみません、書き忘れました。SyBaseです。しかも、条件が抜けていました。もう1行 AND B.flag = 0 がありました。これがあれば意味のない結合条件ということではなくなりますか? 同じテーブル同士を結合している例を初めて見たのですが、結構あるものなのですね。マスターできるように頑張ります。

関連するQ&A

  • 一定以上の行があれば最大値を持つ行を削除するSQL

    MySQL5にて、あるテーブルの特定フィールドの数(つまりcount値)が一定値以上であれば、間引きのため別のフィールドの値で最大値をもつ行を削除するSQLを考案中です。 イメージとしては以下の通りですが、SQLとしては誤っており、また、冗長です。 DELETE FROM table WHERE id={$id} AND (SELECT COUNT(*) FROM table WHERE id={$id}) > 5 AND begin = (SELECT MAX(begin) FROM table WHERE id={$id}); よい知恵をお授けください。

    • ベストアンサー
    • MySQL
  • SQL文について困っています

    ID(NUMBER型)と NUM(NUMBER型)と nenngetu (date型)を持ったテーブルAAAから、 ID=1000 のなかで日時が一番古い処理NOをselectするSQL文を書きましたが上手く実行されません。 select NUM from AAA where nenngetu = (select min(nenngetu) from AAA) and ID=1000; ID=1000の条件をはぶき、 select NUM from AAA where nenngetu = (select min(nenngetu) from AAA); でしたら、実行できました。 oracleで実行しようとしています。 どなたか、書き方を教えてください。

  • LEFT 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に関係しているのでしょうか?

    • ベストアンサー
    • MySQL
  • SQL文で困っています。

    ID(NUMBER型)と NUM(NUMBER型)と nenngetu (date型)を持ったテーブルAAAから、 ID=1000 のなかで日時が一番古い処理NOをselectするSQL文を書きましたが上手く実行されません。 select NUM from AAA where nenngetu = (select min(年月) from D_KR_SAP_IFRIREKIKANRI) and ID=1000; ID=1000の条件をはぶき、 select NUM from AAA where nenngetu = (select min(年月) from D_KR_SAP_IFRIREKIKANRI); でしたら、実行できました。 oracleで実行しようとしています。 どなたか、書き方を教えてください。

  • SQLで他のテーブルに無いIDの抽出

    MySQLを使っています。 下記は、 1.テーブルaaaには、存在するidのものが、 2.テーブルbbbには、存在しない、 3.テーブルaaaのレコードを抽出したいものです。 "SELECT DISTINCT aaa.*" + " FROM aaa" + " WHERE (aaa.flag = false)" + " AND NOT EXISTS (SELECT * FROM bbb" + " WHERE (aaa.id = bbb.id) AND (bbb.flag = false))" ですが、実行すると、下記エラーがでます。 SQLException:Base table or view not found, message from server: \"Unknown table 'bbb' in where clause" どうすればよいのでしょうか?

    • ベストアンサー
    • MySQL
  • SQLのSELECT文で*を使わない理由

    SQLでSELECT文を使う場合、大抵  SELECT ID, user FROM u_table のように、取得する項目を指定すると思います。 これを、  SELECT * FROM u_table としないのには、トラフィックの問題以外に何か理由があるのでしょうか?

  • sql文の中での時間取得

    sql文の中で以下のように時間を指定してselectしています。ですが、時間を「sqlの実行時間からn分前までの間」に修正したいと考えています。どなたかご教示いただけませんでしょうか。 select count(*) from tableA where hoge = '0000' and end_time >= cast('2000/1/01 00:00' as timestamp) and end_time < cast('2011/1/31 00:00' as timestamp) たとえば select count(*) from tableA where hoge = '0000' and end_time >= sqlを実施した時間から45分前 and end_time < sqlを実施した時間 のようにしたいです。 ご協力お願い致します。

  • 【初歩的な質問ですが・・・】 SQL文書き方がわかりません

    SQLの知識に乏しい者です。 よろしくお願い致します。 ●テーブルA ・会計コード ・年度 ・部署番号 ・社員番号 ・その他幾つかのデータ ※Where句で「年度>2002年」以降を抽出 のテーブルがあります。 この時、Bテーブルで ●テーブルB ・会計コード(主キー) ・年度 ・部署番号(主キー) ・社員番号(主キー) ・その他幾つかのデータ ※Aテーブルで抽出されたデータの中から絞り込む というテーブルを抽出するSQL文を組みたいのですが、効率の良いやり方がわかりません。 副問合せで  Select [B表で抽出した列名…]  From B表  Where 会計コード = (Select 会計コード               From A表               Where 年度 > '2002')  AND 部署番号 = (Select 部署番号             From A表               Where 年度 > '2002') ・・・・以下省略 の様に書くと効率が悪い気がしました。 (実際には、副問合せが6個書くことになるため) 良い書き方を知っている方がいらっしゃいましたら、よろしくお願い致します。

  • SQL文を教えてください

    先日SQL文のことです、 tabelC:IDの中分類、IDの中分類名称 があって、以下のSQL文にリレーションを作りたいです: SELECT Mid(tableA.ID,4,2) AS IDの中分類, Sum(tableA.数量) AS 数量の合計 FROM tableA GROUP BY Mid(tableA.ID,4,2); 用は、IDの中分類名称、数量の合計を求めたいです。 ご指導をお願いいたします。

  • select文について

    現在、"user"というテーブルに"id"と"date(datetime)"という項目があり、その"date"にあるデータの中から月を指定して抽出したくて以下ようなSQL文を書いたのですがうまくいきません。 SELECT `id` FROM `user` WHERE convert((SELECT extract(month from `date`) FROM `user`), INTEGER) = 9 mysql5.0です。 よろしくお願いします。

    • ベストアンサー
    • MySQL