C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

JOINの結合条件の書式について

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■90144 / inTopicNo.1)  JOINの結合条件の書式について
  
□投稿者/ 粗品 (4回)-(2019/02/12(Tue) 14:05:33)

分類:[データベース全般] 

クエリの構文についてですが、大抵の説明サイト等でよくある外部結合の例文として

SELECT *
FROM A
LEFT OUTER JOIN B ON A.xxx = B.xxx
WHERE A.xxx < 100

というのがありますが、LEFT の ON以降の条件式の左辺、右辺のルールとかあるのでしょうか?

文法としては(A.xxx = B.xxx)でも逆の(B.xxx = A.xxx)でも通るのですが、
どのサイトも(A=B)形式で表示しています

「メインテーブルのこの項目が外部テーブルのこの項目に繋がる」という考え方なのかとも思うのですが

ただこのBテーブルの条件に区分が1の時、を入れるとしたらこの考え方だと
LEFT OUTER JOIN B ON A.xxx = B.xxx AND B.区分 = 1
となり、「B.」が左辺右辺両方に出ることになります。

それなら最初から「このテーブルのこの項目の対になるのはあのテーブルのこの項目です」形式の
LEFT OUTER JOIN B ON B.xxx = A.xxx
であれば定数で判断する条件があってもなくても
「左辺はこのテーブルの項目、右辺はそれに対する条件」
という一定した書き方が成立すると思うのです

コレに言及したサイトが見つけられなかったので質問しました

引用返信 編集キー/
■90146 / inTopicNo.2)  Re[1]: JOINの結合条件の書式について
□投稿者/ WebSurfer (1764回)-(2019/02/12(Tue) 15:01:48)
No90144 (粗品 さん) に返信

DB は何ですか? SQL Server? MySQL? Oracle? その他?

質問に関することは大体何でも同じかもしれませんが、決まっているなら書いてください。
引用返信 編集キー/
■90147 / inTopicNo.3)  Re[2]: JOINの結合条件の書式について
□投稿者/ 粗品 (5回)-(2019/02/12(Tue) 15:45:56)
No90146 (WebSurfer さん) に返信
>
> DB は何ですか? SQL Server? MySQL? Oracle? その他?
失礼しました。
ターゲットはSQL Server 2014です
引用返信 編集キー/
■90148 / inTopicNo.4)  Re[3]: JOINの結合条件の書式について
□投稿者/ 魔界の仮面弁士 (2046回)-(2019/02/12(Tue) 17:25:24)
No90144 (粗品 さん) に返信
> LEFT の ON以降の条件式の左辺、右辺のルールとかあるのでしょうか?

比較式としての「=」は、左右を入れ替えても同じ意味になりますね。

NULL 値については = で比較できないので、IS NULL 等を使いますけれども。
(A.COL1 IS NULL や NULL IS A.COL1 とは書けるが、A.COL1 IS B.COL2 とは書けない)


いずれにせよ、WHERE にしても
INNER JOIN にしても
CROSS JOIN にしても
LEFT OUTER JOIN にしても
RIGHT OUTER JOIN にしても、
「A.COL1 = B.COL2」と「B.COL2 = A.COL1」の表現については、
『どちらでも構わない』が基本ルールとなります。


No90147 (粗品 さん) に返信
> ターゲットはSQL Server 2014です

ANSI_NULLS オプションが無効な場合、X IS NULL や NULL IS X を
X = NULL や NULL = X と書けるようにはなりますね。
(この場合、A.COL1 = B.COL2 で、両方とも NULL の場合も真となります)



No90144 (粗品 さん) に返信
> という一定した書き方が成立すると思うのです

自分としては、特に否定する材料は持ち合わせていません。

どちらの表記でも良いと思いますが、可読性などの点で、
一方の書き方によりメリットを感じるのであれば、
そのルールを踏襲して記述していけば良いと思いますよ。
引用返信 編集キー/
■90149 / inTopicNo.5)  Re[3]: JOINの結合条件の書式について
□投稿者/ WebSurfer (1765回)-(2019/02/12(Tue) 17:30:44)
No90147 (粗品 さん) に返信

> LEFT の ON以降の条件式の左辺、右辺のルールとかあるのでしょうか?

SQL Server ということですと、Transact-SQL という言語の文法が適用されるということになると
思いますが、とすると、以下の Microsoft のドキュメント、

FROM (Transact-SQL)
https://docs.microsoft.com/ja-jp/sql/t-sql/queries/from-transact-sql?view=sql-server-2017

の「ON <search_condition>」のセクション、それから "検索条件および述語の詳細については、
「検索条件 (Transact-SQL)」を参照してください" としてリンクが張ってある、

検索条件 (Transact-SQL)
https://docs.microsoft.com/ja-jp/sql/t-sql/queries/search-condition-transact-sql?view=sql-server-2017

が適用されるということになるはずです。

それを自分が見た限り A.xxx = B.xxx または B.xxx = A.xxx のどちらかでなければならないという
ようなことは書いてなくて、どっちでも文法違反ではなさそうに見えます。

・・・が、自信なしです。

お役に立てずすみませんが、Transact-SQL に詳しい方の回答をお待ちいただければと思います。
引用返信 編集キー/
■90151 / inTopicNo.6)  Re[1]: JOINの結合条件の書式について
□投稿者/ 氏 (1回)-(2019/02/12(Tue) 19:14:45)
No90144 (粗品 さん) に返信
> というのがありますが、LEFT の ON以降の条件式の左辺、右辺のルールとかあるのでしょうか?

構文上は問題ないので「分かりやすければどちらでもいい」です。

ただ、私が書く場合は(A.xxx = B.xxx)にすると思います。
"A LEFT OUTER JOIN B"である以上、Aが左テーブル、Bが右テーブルであるためです。


> ただこのBテーブルの条件に区分が1の時、を入れるとしたらこの考え方だと
> LEFT OUTER JOIN B ON A.xxx = B.xxx AND B.区分 = 1
> となり、「B.」が左辺右辺両方に出ることになります。

という例を挙げられていますが、
  「Aテーブルの情報を表示する。
    ただし、Aテーブルの"重要度"が"1"の場合は
    Bテーブルから同一IDで"区分"が"1"のデータを併記する」
という条件になった場合、
 LEFT OUTER JOIN B ON A.重要度 = 1 AND A.ID = B.ID AND B.区分 = 1
となり統一も何もないです。


> このテーブル
という表現を見るに、
おそらく、"LEFT OUTER JOIN B ON A.xxx = B.xxx"をひとかたまりとして、
ONの後の条件をBに対する制約と見ているために起きた疑問だと思うのですが、
実際は"A LEFT OUTER JOIN B ON A.xxx = B.xxx"まででひとかたまりであり、
ONの後の条件はAとBの結合条件です。



引用返信 編集キー/
■90177 / inTopicNo.7)  Re[4]: JOINの結合条件の書式について
□投稿者/ 粗品 (6回)-(2019/02/14(Thu) 15:17:59)
No90149 (WebSurfer さん) に返信
> 検索条件 (Transact-SQL)
> https://docs.microsoft.com/ja-jp/sql/t-sql/queries/search-condition-transact-sql?view=sql-server-2017

すみません、わざわざ探し出して頂いて
文法的には問題なしなんですね
Perlじゃないですけど、やり方はひとつじゃない ということでしょうか
引用返信 編集キー/
■90178 / inTopicNo.8)  Re[4]: JOINの結合条件の書式について
□投稿者/ 粗品 (7回)-(2019/02/14(Thu) 15:20:16)
No90148 (魔界の仮面弁士 さん) に返信
>
> どちらの表記でも良いと思いますが、可読性などの点で、
> 一方の書き方によりメリットを感じるのであれば、
> そのルールを踏襲して記述していけば良いと思いますよ。

ありがとうございます
社内で混在している状況だったので、文法とか作法とかがあるのであれば統一できる取り掛かりを探しておりました

引用返信 編集キー/
■90179 / inTopicNo.9)  Re[2]: JOINの結合条件の書式について
□投稿者/ 粗品 (8回)-(2019/02/14(Thu) 15:22:30)
No90151 (氏 さん) に返信

> ただ、私が書く場合は(A.xxx = B.xxx)にすると思います。
> "A LEFT OUTER JOIN B"である以上、Aが左テーブル、Bが右テーブルであるためです。
>
>>このテーブル
> という表現を見るに、
> おそらく、"LEFT OUTER JOIN B ON A.xxx = B.xxx"をひとかたまりとして、
> ONの後の条件をBに対する制約と見ているために起きた疑問だと思うのですが、
> 実際は"A LEFT OUTER JOIN B ON A.xxx = B.xxx"まででひとかたまりであり、
> ONの後の条件はAとBの結合条件です。

ありがとうございます

クエリを書くときは改行を入れながら作るのでついつい別体で考えていましたが、
1つの記述で考えると確かにそうですね。
先に発生したテーブルが先 という考え方だと納得です。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ