かなり混乱しているSQLクエリを作成しようとしています。初心者のSQLユーザーが複雑なSQLクエリを作成しようとしています
私の例では私は4つのテーブル照会しています:
- ユーザー
- ドキュメント
- ネットワーク
- 私のデータベースでNetwork_Documents
次の規則は、インプレース、次のとおりです。ユーザーは自分の文書を作成することができますユーザーはネットワークのメンバーになることができます。彼らは自分の文書のいくつかをネットワークに割り当てることを選ぶことができます。ドキュメントとネットワーク間のリンクは、DocumentIDとNetworkIDを格納する 'Network_Documents'に格納されます。
私がしようとしているのは、ネットワークに割り当てられているすべてのドキュメントを取得するクエリを作成することです。私は今に必要なもの
userID userName userEmail
1 Adam [email protected]
2 Greg [email protected]
3 Tony [email protected]
docID docName docContents docCreator(FK)
1 document01 dcmnt01A 1
2 document02 dcmnt02B 2
3 document03 dcmnt03C 3
networkID networkName networkCreator(FK)
1 network01 1
2 network02 2
3 network03 3
docnetID netID(FK) docID(FK)
1 1 1
2 1 3
3 2 9999
は、ネットワークに関連付けられたすべての文書をフェッチSELECTクエリを作成することです。たとえば、以下の私のデータベースのデータであると言います。たとえば、network01を照会すると、次の2つの文書が検索されます。
ドキュメントネットワーク:network01
ドキュメント名:document01
文書作成者:アダム
ドキュメントネットワーク:network01
ドキュメント名:document03
ドキュメント作成者:トニー
は、私は次のSQLクエリはspecificeネットワークからすべての文書(およびその作成者)を選択するだろうと思った:
SELECT users.userID, users.userName,
documents.docID, documents.docName, documents.docContents, documents.docCreator
networks.networkID, networks.networkName, networks.networkCreator,
network_documents.netID, network_documents.docID
FROM users, documents, networks, network_documents
WHERE networkID = 1;
上記のクエリは、数百を生成するようです!レコードとほぼすべて重複しています。このタイプのクエリを作成する正しい方法は何ですか?繰り返しを避けるために)テーブル名に
SELECT [...]
FROM networks n
INNER JOIN network_documents nd ON n.networkID = nd.networkID
INNER JOIN documents d ON nd.docID = d.docID
INNER JOIN users u ON d.docCreator = u.userID
WHERE n.networkID = 1;
私が使用しているalises(短い形式):JOIN
を使用して任意のヘルプ
あなたの最大の問題は、あなたの結合条件を指定していないということです - システムが本当にあなたがそれらの行は、関連する方法を伝えることはできません。ああ、通常、あなたの 'JOIN'を明示的に宣言し、暗黙結合構文(カンマ区切りの' FROM'リスト)を使用しない方が良いでしょう。 'LEFT JOIN'を指定しようとすると面白くなってきます。また、 'docNetId'は必要ありません - [' netId'、 'docId']は一意でなければなりません。そして、カラム名の前にテーブル名を付けないでください(おそらくidカラムを保存してください)。これはちょうどノイズです。 –