0

我在编写查询时遇到了一些麻烦。

这是两张表

表 1(此处没有 NULL 值):

FileInfo
 - fileId (pk)
 - fileCode
 - fileDescription

表 2(NULL 值如下所述):

FileFolderHierarchy
 - fileId (fk)
 - folderId (fk)
 - fileFolderKey (pk)

表 3(此处没有 NULL 值):

Folder
 - folderId (pk)
 - folderName

表 2,FileFolderHierarchy,链接表 1 和表 3

在 FileFolderHierarchy 中,一条记录的 folderId 为 NULL 或 fileId 为 Null

以下是 FileFolderHierarchy 中的两条记录:

fileId  folderId fileFolderKey
------------------------------
NULL    794     0001
3944    NULL    0001000000000000

第一条记录是文件夹,第二条记录是文件。

我想获取有关文件的信息。即fileId、fileCode、fileDescription、fileFolderKey、folderId和folderName

是我昨天问的一个类似问题。我编写的任何查询似乎都忽略了 fileId 或 folderId,或者完全忽略了 Folder 表。

我没有做太多的 SQL,但在这里阅读关于 JOINS 的信息告诉我,查询的一部分导致 NULL 值,这就是文件夹信息不显示的原因。

有什么线索吗?

问候。

4

2 回答 2

0

我看到您将面临的主要问题是文件和文件夹之间的关系位于 FileFolderHierarchy 表中的 2 个不同行中。

自行检索文件信息(或文件夹信息)很简单

DECLARE @FileFolderHierarchy TABLE(
        fileId INT,
        folderId INT,
        fileFolderKey VARCHAR(50)
)

INSERT INTO @FileFolderHierarchy SELECT NULL,794,'0001'
INSERT INTO @FileFolderHierarchy SELECT 3944,NULL,'0001000000000000'

DECLARE @FileInfo TABLE(
        fileID INT,
        fileCode VARCHAR(50),
        fileDescription VARCHAR(50)
)

INSERT INTO @FileInfo SELECT 3944, 'TADA', 'TADA DESC'

DECLARE @Folder TABLE(
        folderId INT,
        folderName VARCHAR(50)
)
INSERT INTO @Folder SELECT 794, 'TADA FOLDER'

SELECT  fi.*
FROM    @FileFolderHierarchy ffh    INNER JOIN
        @FileInfo fi    ON  ffh.fileId = fi.fileID

一旦你添加了第三步,事情就会变得不稳定

SELECT  fi.*
FROM    @FileFolderHierarchy ffh    INNER JOIN
        @FileInfo fi    ON  ffh.fileId = fi.fileID INNER JOIN
        @Folder f   ON  ffh.folderId = f.folderId

将不返回任何结果,因为不存在这样的行。

此时您可能已经想到了 parentID,它与文件所属文件夹的文件夹结构有关,因此文件夹可以属于父文件夹。您没有这样的结构,因此我们需要使用您提供的 Hierarchy 键。

因此,查看您提供的数据,我假设密钥为 0001000000000000 的文件与密钥为 0001 的文件夹相关。在这里,我将再次划分字段以便于搜索。所以文件密钥应该读到类似 0001\000000000000

同样,情况似乎并非如此,所以让我们看看我们能做些什么。

你可以尝试类似的东西

SELECT  fi.*,
        f.*
FROM    @FileFolderHierarchy ffh    INNER JOIN
        @FileInfo fi    ON  ffh.fileId = fi.fileID INNER JOIN
        @FileFolderHierarchy ffhParent  ON  ffh.fileFolderKey LIKE  ffhParent.fileFolderKey + '%'
                                        AND ffh.fileFolderKey != ffhParent.fileFolderKey INNER JOIN
        @Folder f   ON  ffhParent.folderId = f.folderId

不幸的是,一旦您开始查看多级层次结构,这将不会返回 expexted 结果。

于 2013-03-22T07:00:25.263 回答
-1

试一试FULL OUTER JOIN

SELECT f.fileId, f.code, f.description, h.folderId, 
       h.folderKey, fl.folderName
FROM   File f
       FULL JOIN FileFolderHierarchy h
         ON f.fileId = h.fileId 
       FULL JOIN Folder fl
         ON h.folderId = fl.folderId
WHERE  fl.folderId is null
于 2013-03-22T06:52:32.777 回答