none
複数テーブルからSQLで取得したデータをデータセットに。。。 RRS feed

  • 質問

  • ASP.NET超初心者です。
    ASP.NET+Oracle10g+VisualStudio2008でVBでゴリゴリ開発しています。

    複数のテーブルからSQLで取得したデータをデータセットに入れたいのですが、
    下記のようなエラーメッセージが表示され、うまく動作しません。
    どなたかご教授いただけませんでしょうか?
    <<エラーメッセージ>>
    ORA-00918:列の定義が未確定です。
    (下記略ソースの11行目で上記エラーが出ています。)

    <<略ソース>>
    01 cnn.ConnectionString = "User Id=ID;Password=PassWord;Data Source=DB"
    02 cmd.Connection = cnn
    03 sSQL = "select * from TA "
    04 sSQL2 = "select TA.*, TB.* from TA,TB where TA.Key = TB.Key "
    05 cmd.CommandText = sSQL
    06 Dim da As New OracleDataAdapter(cmd)
    07 Dim ds As New DataSet()
    08 da.SelectCommand = cmd
    09 da.Fill(ds, "TA")
    10 da.SelectCommand = New OracleCommand(sSQL2, cnn)
    11 => da.Fill(ds, "○○○○")
    12 ds.Relations.Add("Relate", ds.Tables("TA").Columns("Key"), ds.Tables("○○○○").Columns("Key"), False)
    13 rep.DataSource = ds.Tables("TA")
    14 rep.DataBind()

    どなたかご教授いただきますようお願いします。
    2009年5月15日 1:56

回答

  • どのように変更したのでしょうか?

    同じ列名がある場合、そのまま同名でSELECTできません。trapemiyaさんのおっしゃるようにエイリアスが必要です。
    ASP.NET以前に、Transaction-SQLの構文を理解しないと、これからも同じような部分でつまづいてしまいます。一度、体系的に学ばれることをオススメいたします。


    例えば、SQLは以下のようになるでしょうか。

    SELECT
      TA.KEY AS A_KEY,
      TB.KEY AS B_KEY
    FROM
      TA
      INNER JOIN
        TB
      ON TA.KEY = TB.KEY
    • 回答としてマーク てんぱる 2009年5月15日 5:24
    2009年5月15日 4:29

すべての返信

  • たぶんTAとTBに同じ列名があるからだと思います。

    04 sSQL2 = "select TA.*, TB.* from TA,TB where TA.Key = TB.Key "

    となっていますが、*を使わずに具体的な列名を指定して下さい。もし、TAとTBで同じ列名の列を同時に記述する必要があれば、エイリアスを使って区別するようにして下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年5月15日 3:15
    モデレータ
  • 早速の返信ありがとうございます。

    実際に接頭語を付加して具体的に列名を特定してみました。が、やはり同じ行のところで
    「ORA-00918:列の定義が未確定です。」
    というエラーメッセージが出てしまいます。

    どのように対処すればよろしいのでしょうか?
    お手数ですが、よろしくお願いします。

    2009年5月15日 4:14
  • TAとTBにhogeという同じ列名がある場合、以下のような感じです。

    select TA.hoge as hogeA, TB.hoge as hogeB from TA,TB where TA.Key = TB.Key
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年5月15日 4:26
    モデレータ
  • どのように変更したのでしょうか?

    同じ列名がある場合、そのまま同名でSELECTできません。trapemiyaさんのおっしゃるようにエイリアスが必要です。
    ASP.NET以前に、Transaction-SQLの構文を理解しないと、これからも同じような部分でつまづいてしまいます。一度、体系的に学ばれることをオススメいたします。


    例えば、SQLは以下のようになるでしょうか。

    SELECT
      TA.KEY AS A_KEY,
      TB.KEY AS B_KEY
    FROM
      TA
      INNER JOIN
        TB
      ON TA.KEY = TB.KEY
    • 回答としてマーク てんぱる 2009年5月15日 5:24
    2009年5月15日 4:29
  • ありがとうございました。

    INNER JOIN を使用することで無事解決しました、ありがとうございました。

    今までできるだけ INNER JOIN を使用しない SQL で他の言語での開発をしていて問題
    ありませんでしたので、てっきり...

    どうもありがとうございました。
    2009年5月15日 5:33
  • INNER JOIN を使用することで無事解決しました、ありがとうございました。

    いや、inner joinは直接関係ないと思いますよ。inner joinの場合、エイリアス(ASの部分)をとっても動きますか?
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年5月15日 6:53
    モデレータ