none
『マルチパート識別子 "..." をバインドできませんでした。 』のエラー RRS feed

  • 質問

  • お世話なります。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));
    

    2010年2月20日 3:32

回答

  • ざっと見ただけですが、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
    2010年2月20日 7:43

すべての返信

  • ざっと見ただけですが、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
    2010年2月20日 7:43
  • お世話になります.相関サブクエリから結合に変更した所うまくいきました.ありがとうございました.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);

    2010年2月21日 21:13