SQL中的JOIN问题

时间:2013-03-22 06:47:55

标签: sql sql-server

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

这是两个表

表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

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

我没有做太多SQL但是阅读JOINS here告诉我,查询的一部分导致NULL值,这就是文件夹信息没有出现的原因。

任何线索?

问候。

2 个答案:

答案 0 :(得分: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

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

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

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

答案 1 :(得分:-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