我的数据库中有3个表:
当我从两个表中选择数据时,它将仅显示用户已阅读的文档。我想输出完整的文档列表,但如果用户有或没有阅读过该文档,则输出。
在“User-ReadDoc”表中有一列指定了这一点。
Sudo代码示例
SELECT * FROM Documents, User-ReadDoc
它只显示一行,说明谁已经阅读了我只想要一个列表的文档,所以如果那些数据不存在,那就是真的,并放置一个“null”或“0”
BTW我正在使用SQL Server 2005 ...
感谢。
答案 0 :(得分:1)
嗨Tristian,欢迎来到Stack Overflow。
您正在寻找的是左外连接。包括表A中的所有项目以及仅包含表B中与之匹配的项目。
LEFT OUTER JOIN是允许您指定连接子句的JOIN操作之一。它保留了第一个(左)表中不匹配的行,将它们与第二个(右)表形状的NULL行连接起来。 source
所以在你的例子中它看起来像这样:
SELECT *
FROM Documents D
LEFT OUTER JOIN User_Read_Docs U
ON D.ID = U.ID
祝你好运!
答案 1 :(得分:0)
我需要查看实际字段,但听起来您需要LEFT JOIN
。
答案 2 :(得分:0)
这样的事情应该可以解决问题。使用CROSS JOIN给出User和Document的每个组合,然后LEFT JOIN到User-ReadDoc以查看该用户是否已阅读该文档。
SELECT *, CASE WHEN r.documentid IS NULL THEN 0 ELSE 1 END AS HasRead
FROM User u
CROSS JOIN Documents d
LEFT JOIN [User-ReadDoc] r ON u.userid = r.userid
AND d.documentid = r.documentid
答案 3 :(得分:0)
我不清楚您是希望每个文档的读取总数,还是每个文档的每个用户读取总数。
这将为您提供每个文档的读取总数。
SELECT DD.*, ISNULL(XX.Reads, 0)
FROM [Documents] DD
OUTER APPLY (SELECT SUM(1) Reads
FROM [User-ReadDoc] RR
WHERE RR.DocKey = DD.DocKey) XX
这将为您提供文档和用户的总读数。
SELECT UU.UserKey, DD.*, ISNULL(XX.Reads, 0)
FROM [User] UU
CROSS JOIN [Documents] DD
OUTER APPLY (SELECT SUM(1) Reads
FROM [User-ReadDoc] RR
WHERE RR.DocKey = DD.DocKey AND RR.UserKey = UU.UserKey) XX
而且,如果你只想要一个用户:
DECLARE @userKey INT
SELECT UU.UserKey, DD.*, ISNULL(XX.Reads, 0)
FROM [Documents] DD
OUTER APPLY (SELECT SUM(1) Reads
FROM [User-ReadDoc] RR
WHERE RR.DocKey = DD.DocKey AND RR.UserKey = @userKey) XX
答案 4 :(得分:0)
LEFT JOIN是要走的路
SELECT * FROM Documents d LEFT JOIN User-ReadDoc ud ON d.DocID = ud.DocID
加上你应该只选择所需的字段。