トップ回答者
同じテーブルから2つのサブクエリでJOINするとうまくいかない。

質問
-
どこのフォーラムで聞くべきかと考えましたが、一応VSで発生ということでここで質問させてください。
VS2005(VB)
SQLServer2005
の環境で、
----------
[TM_Jyugyoin]
JyugyoinCd numeric(8, 0)
Simei nvarchar(16)
BusyoCd numeric(4, 0)
KyuyoSb numeric(1, 0)[TM_Code]
CdBunruiCd numeric(2, 0)
Cd numeric(9, 0)
Nm nvarchar(20)
----------のようなテーブルがあって、
VSのTableAdapter構成ウィザードで
----------
(SQL文1)
SELECT TM_Jyugyoin.JyugyoinCd, TM_Jyugyoin.Simei, TM_Jyugyoin.KyuyoSb,
M_KyuyoSb.Nm AS KyuyoSbNm, M_Busyo.Nm AS BusyoNm
FROM TM_Jyugyoin LEFT OUTER JOIN
(SELECT Cd, Nm
FROM TM_Code
WHERE (CdBunruiCd = @CdBunrui_KyuyoSb)) AS M_KyuyoSb ON
TM_Jyugyoin.KyuyoSb = M_KyuyoSb.Cd LEFT OUTER JOIN
(SELECT Cd, Nm
FROM TM_Code AS TM_Code_1 <---なぜか'AS TM_Code_1'が自動追加されてしまう。
WHERE (CdBunruiCd = @CdBunrui_Busyo)) AS M_Busyo ON
TM_Jyugyoin.BusyoCd = M_Busyo.Cd
ORDER BY TM_Jyugyoin.JyugyoinCd
----------のSQL文を設定して、クエリビルダーのクエリ実行を行うとBusyoNm列がすべて<サポートされていないデータ型>となってしまい、VBプログラムからこのTableAdapterでデータを取得するとKyuyoSbNmにもBusyoNmにも何も入ってきません。(それ以外の項目は値が入ってきます。)
試しに
----------
(SQL文2)
SELECT TM_Jyugyoin.JyugyoinCd, TM_Jyugyoin.Simei, TM_Jyugyoin.KyuyoSb,
'給与種別だよ' AS KyuyoSbNm, M_Busyo.Nm AS BusyoNm
FROM TM_Jyugyoin LEFT OUTER JOIN
(SELECT Cd, Nm
FROM TM_Code
WHERE (CdBunruiCd = @CdBunrui_Busyo)) AS M_Busyo ON
TM_Jyugyoin.BusyoCd = M_Busyo.Cd
ORDER BY TM_Jyugyoin.JyugyoinCd
----------を実行してみると正常に表示されますが、
----------
(SQL文3)
SELECT TM_Jyugyoin.JyugyoinCd, TM_Jyugyoin.Simei, TM_Jyugyoin.KyuyoSb,
'給与種別だよ' AS KyuyoSbNm, M_Busyo.Nm AS BusyoNm
FROM TM_Jyugyoin LEFT OUTER JOIN
(SELECT Cd, Nm
FROM TM_Code AS TM_Code_1 <---わざと追加。
WHERE (CdBunruiCd = @CdBunrui_Busyo)) AS M_Busyo ON
TM_Jyugyoin.BusyoCd = M_Busyo.Cd
ORDER BY TM_Jyugyoin.JyugyoinCd
----------を実行すると(SQL文1)と同じエラーになります。
また、試しに、Accessのパススルークエリとして(SQL文1)を実行すると正常に表示されます。
どうすればうまくいくかどなたかご指南ください。よろしくお願いします。
回答
-
テーブルの別名のためにNm列の型を見失ってるようですね。
M_KyuyoSbでは別名にされていないのでそちらの列を使うか、CAST(M_Busyo.Nm AS nvarchar(20)) As BusyoNmとして、型を明確にすればうまくいくと思います。
Code SnippetSELECT TM_Jyugyoin.JyugyoinCd, TM_Jyugyoin.Simei, TM_Jyugyoin.KyuyoSb,
M_KyuyoSb.Nm AS KyuyoSbNm, M_KyuyoSb.Nm AS BusyoNm /*もしくはCAST*/
FROM TM_Jyugyoin
LEFT OUTER JOIN
(SELECT Cd, Nm
FROM TM_Code
WHERE (CdBunruiCd = 1)
) AS M_KyuyoSb
ON TM_Jyugyoin.KyuyoSb = M_KyuyoSb.Cd
LEFT OUTER JOIN
(SELECT Cd, Nm
FROM TM_Code AS TM_Code_1
WHERE (CdBunruiCd = 1)
) AS M_Busyo
ON TM_Jyugyoin.BusyoCd = M_Busyo.Cd
ORDER BY TM_Jyugyoin.JyugyoinCd
すべての返信
-
テーブルの別名のためにNm列の型を見失ってるようですね。
M_KyuyoSbでは別名にされていないのでそちらの列を使うか、CAST(M_Busyo.Nm AS nvarchar(20)) As BusyoNmとして、型を明確にすればうまくいくと思います。
Code SnippetSELECT TM_Jyugyoin.JyugyoinCd, TM_Jyugyoin.Simei, TM_Jyugyoin.KyuyoSb,
M_KyuyoSb.Nm AS KyuyoSbNm, M_KyuyoSb.Nm AS BusyoNm /*もしくはCAST*/
FROM TM_Jyugyoin
LEFT OUTER JOIN
(SELECT Cd, Nm
FROM TM_Code
WHERE (CdBunruiCd = 1)
) AS M_KyuyoSb
ON TM_Jyugyoin.KyuyoSb = M_KyuyoSb.Cd
LEFT OUTER JOIN
(SELECT Cd, Nm
FROM TM_Code AS TM_Code_1
WHERE (CdBunruiCd = 1)
) AS M_Busyo
ON TM_Jyugyoin.BusyoCd = M_Busyo.Cd
ORDER BY TM_Jyugyoin.JyugyoinCd