0

クエリを書くのに少し苦労しています。

これらは2つのテーブルです

表 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 からの 2 つのレコードを次に示します。

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

最初のレコードはフォルダーで、2 番目のレコードはファイルです。

ファイルに関する情報を取得したい。つまり、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

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について考えたことがあるかもしれません。さらに言えば、フォルダーは親フォルダーに属することができます。あなたはそのような構造を持っていないので、私たちはあなたが提供した階層キーで作業する必要があります。

したがって、提供されたデータを見ると、キー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

残念ながら、マルチレベルの階層を調べ始めると、これは拡張された結果を返しません。

于 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 に答える