はい、可能です。まず、IDENTITYカラムを持つテーブルにデータをロードする必要があります。
-- drop table #t
CREATE TABLE #t (id INTEGER IDENTITY PRIMARY KEY,
Country VARCHAR(20),
City VARCHAR(20))
INSERT INTO #t(Country, City)
SELECT a.Country, a.City
FROM OPENROWSET(BULK 'c:\import.txt',
FORMATFILE = 'c:\format.fmt',
FIRSTROW = 2) AS a;
select * from #t
結果は以下のようになります。
id Country City
----------- -------------------- --------------------
1 U.S. New York
2 Washington
3 Baltimore
4 Canada Toronto
5 Vancouver
そして今、再帰CTEの魔法のビットとあなたが不足している詳細情報を取り込むことができます。
;WITH a as(
SELECT Country
,City
,ID
FROM #t WHERE ID = 1
UNION ALL
SELECT COALESCE(NULLIF(LTrim(#t.Country), ''),a.Country)
,#t.City
,#t.ID
FROM a INNER JOIN #t ON a.ID+1 = #t.ID
)
SELECT * FROM a
OPTION (MAXRECURSION 0)
結果:
Country City ID
-------------------- -------------------- -----------
U.S. New York 1
U.S. Washington 2
U.S. Baltimore 3
Canada Toronto 4
Canada Vancouver 5
更新:
SELECT ID
, COALESCE(NULLIF(LTrim(a.Country), ''), (SELECT TOP 1 Country FROM #t t WHERE t.ID < a.ID AND LTrim(t.Country) <> '' ORDER BY t.ID DESC))
, City
FROM #t a
はところで、あなたの入力データのフォーマットのファイルが(これであなたは試してみたい場合:
タブアレマンは、同じ結果が再帰クエリすることなく達成することができるの下に示唆したように\ IMPORT.TXT及びC以下のようなフォーマットのファイル:\ format.fmt):スクリプトは、cとして入力されたデータを保存
9.0
2
1 SQLCHAR 0 11 "" 1 Country SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 100 "\r\n" 2 City SQL_Latin1_General_CP1_CI_AS
出典
2016-04-13 05:44:26
cha
IDのような別の列がない場合、都市が属する国を特定するのに役立ちます。DBMSが必要なものを得ることは不可能です。彼らは順番に行かないので。 –