我在编写查询时遇到了一些麻烦。
这是两个表
表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值,这就是文件夹信息没有出现的原因。
任何线索?
问候。
答案 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