我正在尝试创建一个相当混乱的SQL查询,我似乎无法弄清楚代码。
在我的例子中,我正在查询四个表:
在我的数据库中,以下规则就位:用户可以创建自己的文档,用户可以是网络的成员。他们可以选择将自己的一些文档分配给网络。文档和网络之间的链接存储在“Network_Documents”中,该文件存储DocumentID和NetworkID。
我要做的是创建一个查询,检索分配给网络的所有文档。例如,假设以下是我的数据库数据:
userID userName userEmail
1 Adam 1@m.net
2 Greg 2@m.net
3 Tony 3@m.net
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,我检索了以下两个文档。
文件网络:network01
文件名称:document01
文件创建者:亚当
文件网络:network01
文件名称:document03
文件创建者:托尼
我认为以下SQL查询将从特定网络中选择所有文档(及其创建者):
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;
以上查询似乎产生了几百个!记录,它们几乎都是重复的。撰写此类查询的正确方法是什么?
感谢您的帮助
答案 0 :(得分:2)
使用JOIN
:
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(简短形式)表名)以避免重复。您有时会看到使用AS
关键字指定的内容(例如networks as n
)。
(为清晰起见,省略了列的列表)