トップ回答者
『マルチパート識別子 "..." をバインドできませんでした。 』のエラー

質問
-
お世話なります。SQL Server 2005ですが、日本郵便のHPからダウンロードしたcsvファイルをAccessでインポートしたものをアップサイジングしたテーブルがあります。主キーはAccessでオートナンバー型です。下記のクエリを実行しようとすると『メッセージ 4104、レベル 16、状態 1、行 1 マルチパート識別子 "T2.CTE_ID" をバインドできませんでした。』のエラーとなります。原因と対策をご教授ください。よろしくお願いします。
MT_KEN_ALL ID int NOT NULL, PRIMARY KEY ZIPcode nchar(7) NOT NULL PREF_kana nvarchar(255) NOT NULL CITY_kana nvarchar(255) NOT NULL AREA_kana nvarchar(255) NOT NULL PREF nvarchar(255) NOT NULL CITY nvarchar(255) NOT NULL AREA nvarchar(255) NOT NULL WITH CTE_1(CTE_ID, CTE_ZIPcode, CTE_PREF, CTE_CITY, CTE_AREA) AS (SELECT ID, ZIPcode, PREF, CITY, AREA FROM MT_KEN_ALL AS T4 WHERE ZIPcode IN (SELECT ZIPcode FROM MT_KEN_ALL AS T5 GROUP BY ZIPcode HAVING (COUNT(ZIPcode) > 1)) AND ZIPcode IN (SELECT ZIPcode FROM MT_KEN_ALL AS T6 WHERE (AREA LIKE '%、%'))) SELECT T1.CTE_ID, T2.CTE_ID FROM CTE_1 AS T1 WHERE T1.CTE_ZIPcode = (SELECT T2.CTE_ZIPcode FROM CTE_1 AS T2 WHERE T2.CTE_ID = (SELECT MIN(CTE_ID) FROM CTE_1 AS T3 WHERE T1.CTE_ID < T3.CTE_ID));
回答
-
ざっと見ただけですが、T2はあくまで検索条件上での話であり、FROM句にT2が無いからだと思います。
T2.CTE_IDの代わりに、
(SELECT MIN(CTE_ID)
FROM CTE_1 AS T7
WHERE T1.CTE_ID < T7.CTE_ID)
と書けばとりあえず表示されると思いますが、もっと効率的な方法があるかもしれません。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク じふ 2010年2月21日 21:13
すべての返信
-
ざっと見ただけですが、T2はあくまで検索条件上での話であり、FROM句にT2が無いからだと思います。
T2.CTE_IDの代わりに、
(SELECT MIN(CTE_ID)
FROM CTE_1 AS T7
WHERE T1.CTE_ID < T7.CTE_ID)
と書けばとりあえず表示されると思いますが、もっと効率的な方法があるかもしれません。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク じふ 2010年2月21日 21:13
-
お世話になります.相関サブクエリから結合に変更した所うまくいきました.ありがとうございました.12万件処理するのに1分30秒ほどかかりますが...
WITH CTE_1(CTE_ID, CTE_ZIPcode, CTE_PREF, CTE_CITY, CTE_AREA) AS (SELECT ID, ZIPcode, PREF, CITY, AREA FROM MT_KEN_ALL AS T4 WHERE ZIPcode IN (SELECT ZIPcode FROM MT_KEN_ALL AS T5 GROUP BY ZIPcode HAVING (COUNT(ZIPcode) > 1)) AND ZIPcode IN (SELECT ZIPcode FROM MT_KEN_ALL AS T6 WHERE (AREA LIKE '%、%'))) SELECT T1.CTE_ID, T2.CTE_ID FROM CTE_1 AS T1 INNER JOIN CTE_1 AS T2 ON T1.CTE_ZIPcode = T2.CTE_ZIPcode WHERE T2.CTE_ID = (SELECT MIN(CTE_ID) FROM CTE_1 AS T3 WHERE T1.CTE_ID < T3.CTE_ID);