2017-12-19 14 views
0

私はSQLSqliteに新しく、これは正しくないかもしれませんが、学問的な理由から私は自分自身を作成し​​た汚れたデータベース。私がボキャブラリーが正しくない場合は私は許し、私はまだ学習過程にある。SQLite:同じ外部キーを共有するすべての項目を選択

それぞれ異なる種類のエンティティを持つテーブルセットを作成しましたが、それらはすべて類似しています。異なる値の同じForeign Keyの複数の出現を共有します。

表M1:2つのアイテムとエンティティ:すべての前のデータ列はUnique Key以下(表N)にForeign Keysある

+------------+---------+--------+-------+-------+ 
Primary Key Unique ID Data1 Data2 Data3 
+------------+---------+--------+-------+-------+ 
     1   y1  103021 103022 103001   

+------------+---------+--------+-------+ 
Primary Key Unique ID Data1 Data2 
+------------+---------+--------+-------+ 
     1   x1  103021 103022  

表M2:3つの項目を持つエンティティ

+------------+---------+--------+-------+ 
Primary Key Unique ID Data1 Data2 
+------------+---------+--------+-------+ 
     1   100002  ...  ... 
     2   103001  ...  ... 
     3   103021  ...  ... 
     4   103022  ...  ... 

私がする必要があるのは、aを共有するすべてのエンティティ固有のアイテム(My Foreign Key)を指定します。例えば、103022が与えられた場合、2つのエンティティ:x1およびy1が与えられます。

今私は数日を試していて、私はJOINステートメントで必要な情報を得ることができました。

INNER JOINを:

SELECT N.id, T1.id FROM N INNER JOIN M1 as T1 on T1.data1=N.id OR T1.data2=N.id 

CROSS JOINを:私は一度に一つのテーブルを行うと、後工程をリアルタイムでのpythonで、と私は理解している場合

SELECT N.id, T1.id FROM N CROSS JOIN M1 as T1 WHERE T1.data1=N.id OR T1.data2=N.id 

INNER JOINにのみ機能しますがCROSS JOINは私のデータのデカルト積を生成し、他のテーブルとブール条件を追加するときに、あまりにも多くのメモリを使いやすくなります。だから私はそれがオプションではないと思う。

私が考えていない方法はありますか?

ありがとうございました!

+1

あなたは何が出力されているかを知ることができますか? –

+0

1.あなたの文章は、M1、M2&N、またはあなたが望む出力については明確ではありません。明確に説明するのに十分な文章を使用してください。 [mcve]を読んで行動する。どの列がFKであるかを他の列に正確に教えてください。 2.実装についての誤解があります。これらの2つの結合は、実用的なDBMSで同じ方法で実装されます。 https://stackoverflow.com/q/44917/3404097また、実装の最適化を心配する前に、単純なクエリを書く方法とクエリの意味について多くのことを学ぶ必要があります。 – philipxy

+0

@philipxy:まず、私はここで学ぶためにここにいることを明らかにした。批判する必要はない。私はあなたの疑問の答えを簡単に見つけることができますが、あなたのリンクを読んでいます。それはあまり役に立たない。 一方、INNERとCROSS結合が同じ効果を持つことを示唆することはできません。CROSS結合はプロセスをクラッシュさせます。 – Chang

答えて

1

私はあなたがテーブルのUnion

SELECT N.id, T1.id FROM N INNER JOIN M1 as T1 on T1.data1=N.id OR T1.data2=N.id 
Union 
SELECT N.id, T1.id FROM N INNER JOIN M2 as T1 on T1.data1=N.id OR T1.data2=N.id 

注意を探していると思う:メインテーブルとM1としてNを考慮すると、M2は、あなたが参加したい他のテーブルです。

+0

ありがとうございます、それは動作します。これはこれを行う最も効率的な方法ですか? – Chang

+0

@Chang - 歓迎..あなたがこれとは違うテーブルから欲しいと思っているのは私が知っていることで、他の方法はほとんどないと思います。もしそれが働いていれば助けてください –

関連する問題