2012-05-02 8 views
1

かなり混乱しているSQLクエリを作成しようとしています。初心者のSQLユーザーが複雑なSQLクエリを作成しようとしています

私の例では私は4つのテーブル照会しています:

  1. ユーザー
  2. ドキュメント
  3. ネットワーク
  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を使用して任意のヘルプ

+0

あなたの最大の問題は、あなたの結合条件を指定していないということです - システムが本当にあなたがそれらの行は、関連する方法を伝えることはできません。ああ、通常、あなたの 'JOIN'を明示的に宣言し、暗黙結合構文(カンマ区切りの' FROM'リスト)を使用しない方が良いでしょう。 'LEFT JOIN'を指定しようとすると面白くなってきます。また、 'docNetId'は必要ありません - [' netId'、 'docId']は一意でなければなりません。そして、カラム名の前にテーブル名を付けないでください(おそらくidカラムを保存してください)。これはちょうどノイズです。 –

答えて

2

ため

感謝。場合によっては、ASキーワード(例:networks as n)で指定したものが表示されることがあります。

(明確にするために省略される列のリスト)

+1

これは初心者ユーザであるため、カラム指定でテーブル名の「短い形式」や「エイリアス」(例: 'SELECT u.userName、d.docName ...')を使用できることを追加します。 –

+0

良い点ジャスティン編集されました。 –

関連する問題