none
同じテーブルから2つのサブクエリでJOINするとうまくいかない。 RRS feed

  • 質問

  • どこのフォーラムで聞くべきかと考えましたが、一応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)を実行すると正常に表示されます。

     

    どうすればうまくいくかどなたかご指南ください。よろしくお願いします。

    2008年10月8日 3:19

回答

  • テーブルの別名のためにNm列の型を見失ってるようですね。
    M_KyuyoSbでは別名にされていないのでそちらの列を使うか、CAST(M_Busyo.Nm AS nvarchar(20)) As BusyoNmとして、型を明確にすればうまくいくと思います。

    Code Snippet
    SELECT  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
    2008年10月8日 9:32

すべての返信

  • テーブルの別名のためにNm列の型を見失ってるようですね。
    M_KyuyoSbでは別名にされていないのでそちらの列を使うか、CAST(M_Busyo.Nm AS nvarchar(20)) As BusyoNmとして、型を明確にすればうまくいくと思います。

    Code Snippet
    SELECT  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
    2008年10月8日 9:32
  • gekka 様

    レスありがとうございました。

     

    教えていただいたCASTを行うことでうまく表示できました。

    ありがとうございました。

     

    2008年10月9日 4:52
  • こんにちは、田中麻記子です。

     

    gekkaさん、回答ありがとうございます。
    コリン星人さん、フォーラムのご利用ありがとうございます。

     

    今回、gekkaさんの回答が参考になったようですので勝手ながら私のほうで
    回答済みチェックを付けさせていただきました。

    今後ともフォーラムをよろしくお願いします。

    それでは!

     

    2008年10月17日 8:59