SQL&多个表和输出数据,但也不存在数据

时间:2012-03-08 23:18:06

标签: sql

我的数据库中有3个表:

  • 用户表
  • 文件表
  • User-ReadDoc表(多对多)

当我从两个表中选择数据时,它将仅显示用户已阅读的文档。我想输出完整的文档列表,但如果用户有或没有阅读过该文档,则输出。

在“User-ReadDoc”表中有一列指定了这一点。

Sudo代码示例

SELECT * FROM Documents, User-ReadDoc

它只显示一行,说明谁已经阅读了我只想要一个列表的文档,所以如果那些数据不存在,那就是真的,并放置一个“null”或“0”

BTW我正在使用SQL Server 2005 ...

感谢。

5 个答案:

答案 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 

加上你应该只选择所需的字段。