私はSQL Server 2008で作業しています。テーブルからデータを抽出( "T")し、別のテーブルにDML(つまりINSERT INTO ... SELECT ... FROM ...
構文)を使用して読み込む必要があります。表Tは、4つのレベルが定義された階層表です(レベル4が最も低く、レベル1が最も高い)。テーブルTの本質的なテーブル構造は以下の通りである:SQL階層テーブル:レベルをジャンプする方法
CREATE TABLE T
(
PK int
,parentID int
,level int
,attribute1 varchar(255)
,attribute2 varchar(255)
,.
.
.
,attributeN varchar(255)
);
すべての行(PK)はPARENTID介して上記レベルで正確に1行このテーブルマップに。私は効果的に私のSELECT
のテーブルTを平らにする必要があります。つまり、所与のレベル4の行について、この行からいくつかの属性を選択し、対応するレベル2の親からの属性とそれに対応するレベル1の親からの属性を選択する必要があります。明らかに、JOIN
をparent.PK = child.parentID
とすれば簡単にできます。ただし、レベル4の行ごとに「レベル3」の親が存在するとは限りません。これらの状況では、レベル4の行はレベル2の親に直接マッピングされます。それでも、すべての状況(レベル3の親が存在する場所と存在しない場所)で使用できるDMLテンプレートを1つだけ作成する必要があります。これどうやってするの?私のベースのクエリ(私が間違っている知っている)である:LEVEL3エントリが見つからない場合
SELECT
level4.attribute1
,level2.attributeN
,level1.attribute2
FROM
T AS level4
INNER JOIN
T AS level3
ON
level3.PK = level4.parentID
INNER JOIN
T AS level2
ON
level2.PK = level3.parentID
INNER JOIN
T AS level1
ON
level1.PK = level2.parentID
WHERE
level4.PK = 100
;
ここで苦労しているのは、テーブルに正規化がないためです。アトリビュート1、アトリビュート2などは繰り返しグループと呼ばれ、1NFに違反します。あなたが持っているべきものは、このようなネスティングを可能にするアーキテクチャです。隣接リストはこれを処理する最も一般的な方法ですが、ネストされたセットはさらに優れています。または、hierarchyidデータ型もあります。どのような場合でも、ddl、サンプルデータ、および望ましい出力を提供する必要があります。ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –