質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NoSQL

NoSQL(not only SQL)は、リレーショナルデータベース管理システムとは異なるデータベースシステムを指す言葉です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

1688閲覧

Couchbaseのn1qlでjoinの仕方がわかりません

yoshis22

総合スコア107

NoSQL

NoSQL(not only SQL)は、リレーショナルデータベース管理システムとは異なるデータベースシステムを指す言葉です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/08/18 10:50

Couchbaseのn1qlでjoinの仕方がわかりません

bucket1とbucket2をleft joinするとき
SQLならば以下の通り

SQL

1select * from bucket1 as b1 left join bucket2 as b2 on b1.test5 = b2.test5

ただ、Couchbaseのn1qlではどうもうまくいきません。
Couchbaseの場合use keyを使っているようですがドキュメントを見てもなかなか理解できません

test5をキーに結合するにはどのように書くことができるでしょうか

json

1bucket1 2{ 3 "test1":"hoge", 4 "test2":"hoge", 5 "test3":"hoge", 6 "test4":"hoge", 7 "test5":"100" 8}, 9{ 10 "test1":"hoge", 11 "test2":"hoge", 12 "test3":"hoge", 13 "test4":"hoge", 14 "test5":"101" 15}

json

1bucket2 2{ 3 "test5":"101", 4 "test6":"hoge", 5 "test7":"hoge", 6 "test8":"hoge", 7 "test9":"hoge" 8}, 9{ 10 "test5":"101", 11 "test6":"hoge", 12 "test7":"hoge", 13 "test8":"hoge", 14 "test9":"hoge" 15}, 16{ 17 "test5":"100", 18 "test6":"hoge", 19 "test7":"hoge", 20 "test8":"hoge", 21 "test9":"hoge" 22}

Couchbaseのn1qlという珍しいものになりますが
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

N1QLは僕も触ったことないので間違ってたらすみません。

以下の画像は、こちらのドキュメントの「7.JOIN」のサンプルの抜粋です。
N1QLのJOIN例

これを見る限り、
N1QLでのJOIN句はON KEYSキーワードを指定する必要があるようです。
(WHERE句の条件が左右であってない気がしますが・・・)

またこちらのサイトのJOIN句の構造モデルを抜粋したものを以下に添付します。

JOIN句の文法

上記によるとSQLのLEFT JOINの場合でも、
INNER JOINの時と同様の記載が可能のようです。(INNER → LEFTでOK?)

そのため質問者さんのクエリをN1QL風に直すと以下のイメージとなるかと思われます。

SQL

1SELECT 2 * 3FROM 4 bucket1 AS b1 5 LEFT JOIN bucket2 AS b2 6 ON KEYS b1.test5

動作確認は出来ていないのでダメだったらすみません・・・^^;

###追記
なるほど、そういう罠があるのですね・・・

こちらでも空き時間で調べ直しみましたが、
その際にこのようなQA(英語情報くらいしかなくて辛い)を見つけました。

もしかしたら上記QAの質問と質問者さんと内容が近いかもしれません。
このQAによるとN1QL(Ver4.1時点)では、
非キー同士の結合はサポートしていないとのことです。
(現在は4.5が最新っぽいですがサポートされるようになってるかは微妙。RIGHT JOIN的なのは出来るようになったとのことですが。ただ今後のバージョンアップでその辺も出来るように改善するとのことです。)

なのでtest5の項目がどちらと非キーということであるならば、
JOIN句利用する手段は不可能となります。

JOIN句を利用できる前提条件ですが、

  • 片側のJSONの主キーを用いられること
  • もう片側は上記主キー対応する外部キーを持つこと

上記を満たす必要があるそうです。

なのでJOINを利用するのであれば、
データモデル自体の見直しとなる可能性が高いかもしれません。
(主キーとかの変更手段があるのか調べてみましたが、どうもこれというのが分かりませんでした・・・)

JOIN以外を用いる別解がありそうな気もしますが、
現時点で当方が回答できるのはここまでとなります。
(あまり見てないけどNESTとか別のアプローチ方もあるかも)

一応また何か分かった場合は追記します。

投稿2016/08/19 16:56

編集2016/08/22 14:56
Panzer_vor

総合スコア1636

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshis22

2016/08/22 01:51

連絡ありがとうございます。 N1QLを作成いただきありがとうございます。 ただ、作成していただいたN1QLですと b1.test5とb2.idが連携するため test5どおしを紐づけることができません。 test5どおしの紐づけまでなかなかたどり着かない状況で困っています。 大変お手数ですがよろしくお願いいたします
yoshis22

2016/08/24 01:52

英語の文書を私も読み漁っていたんですが理解しずらかったです。 それでもここまで調べていただいてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問