• 締切済み

Access SQLを使ったソートがずれる

Access2003で以下のfunctionを組みました。 ************************************* Dim SQL As String Dim strList As String SQL = "" strList = "" 'サブテーブルの削除 SQL = "DELETE * FROM SUB_T" CurrentProject.Connection.Execute SQL SQL = "INSERT INTO SUB_T SELECT Master_T.* FROM Master_T WHERE " With Forms!SEARCH! '検索条件がnullの場合 If IsNull(.CODE_SRH) Then SQL = "INSERT INTO SUB_T SELECT Master_T.* FROM Master_T" End If 'コードの条件 If .CODE_SRH <> "" Then strList = "Master_T.CODE Like '" & .CODE_SRH & "%'" End If End With SQL = SQL & strList & " ORDER BY (val(CODE))" CurrentProject.Connection.Execute SQL ************************************* Master_T テーブルの CODE は テキスト型 内容は以下のとおり "001","あいうえお",.... "003","さしすせそ",.... "002","かきくけこ",.... "013","GHI",.... "011","ABC",.... 検索条件Nullの場合SUB_T テーブルには "001","あいうえお",.... "002","かきくけこ",.... "003","さしすせそ",.... "011","ABC",.... "013","GHI",.... とインサートされるはずですが、何回か実行すると・・・・ "003","さしすせそ",.... "011","ABC",.... "013","GHI",.... "001","あいうえお",.... "002","かきくけこ",.... こんなだったり "011","ABC",.... "013","GHI",.... "001","あいうえお",.... "002","かきくけこ",.... "003","さしすせそ",.... このような感じに並びます。 試しに、明示的に"ORDER BY (val(CODE)) ASC"にしても また降順ではどうかと思い、"ORDER BY (val(CODE)) DESC"にしても 同じ現象が出ます。 コードの条件を入れても同様な現象が出ます。 何が原因なのかさっぱり分かりません。 Accessのどこかを確認すべきか、VBAを見直すべきなのか ご教授いただきたいです。

みんなの回答

  • w_HIRO_w
  • ベストアンサー率47% (9/19)
回答No.2

もし、プログラムソースの問題でなければですが、Access2003を再起動してみては?必要であれば、Windowsの再起動も! 過去にAccessでツールを作成していて、コードと違った動作をする事象がありました。 「コーディング->動作確認->コーディング・・・」のサイクルを何度か繰り返すと度々起きてました。 ですが、Access若しくはWindowsを再起動することで回復してました。 運用時には”おかしい”といった報告はなかったので、開発時に起きる現象と認識して仲良く付き合って作業を進めていましたよ。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

INSERT INTO .. SELECT .. ORDER BY で挿入時の並び順を指定しても、挿入対象のテーブルからデータを取得する際にORDER BY指定しなくては並び順は不定です。 ADOをお使いのようですが、RECORDSETを取得するところでORDER BY指定がされているか確認して下さい。

関連するQ&A

  • SQL構文

    MASTER_TBLを、CDとKAKU_CDの2列で一意をなるようにしたいので、重複データを洗い出すためのSQLを組もうとしています。 FROM句のサブクエリ単体では、正常な結果が取得できるのですが、下のSQLを流すと、全データ件数×全データ件数が結果として返ってきます。 重複行のみを表示するにはどうすればいいのでしょうか?単純な構文ミスのような気がするのですが、、、 SELECT  M1.CD AS CD1,  M1.KAKU_CD AS KAKU_CD1,  M1.UPDATE_DATE AS UPDATE_DATE1 FROM  MASTER_TBL M1,  (   SELECT M2.CD || M2.KAKU_CD AS CODE2, COUNT(*)   FROM MASTER_TBL M2   GROUP BY M2.CD, M2.KAKU_CD   HAVING COUNT(*) > 1  ) SUB_T; WHERE M1.CD || M1.KAKU_CD IN ( CODE2 ) ORDER BY 1, 2, 3 ;

  • SQLでwhileやIFを使った場合の返り値について

     urizakaと申します。  さて、最近までSQLというのはselectやINSERTなどを使ってデータ ベースをいじるものだという認識しかなかったのですが、実は「IF」や「ELSE」 も組み込むことができると聞いて、さっそくプログラミングを組んでみました declare @i int declare @result int set @i = 0 while @i < 10 begin set @i = @i + 1 select @result=count(code_staff_client) from t_issue where code_staff_client=@i if @result != 0 BREAK end  これは、t_issue というテーブルを検索して、コード番号10までの 人間がいるかどうかを調べるためのSQL文なのですが、さて、この時に 条件に適合したら返り値として値1を返して処理を終わるというSQL文 にしたいのですが、この場合返り値についてどのように宣言すれば 良いのでしょうか?  このあとからわからなくなってしまったもので・・・すみませんが、ご存知 の方宜しくお願いします。

  • SQL分のWHERE句について

    SQLのWHERE句について ================================== ABC :入力値(2又は5バイトの可変) T.テーブル.フィールド:ABCが格納されているテーブル(格納すると同時に5桁になります。) 例:01(入力値)⇒01000(格納値) ================================== 参照時のWHERE句の作成の仕方を教えてください。 ※検索値が2桁の場合は、格納値5桁の前方2桁一致でHITさせます。  また5桁の場合は、格納値5桁の全一致です。 今考えているのでは、 IF ABC <> "" THEN IF LenB(ABC) = 2 THEN SQL_WHERE = SQL_WHERE & "AND (LEFT(T.テーブル.フィールド,2) = '" & ABC & "' )" ELSEIF SQL_WHERE = SQL_WHERE & "AND (T.テーブル.フィールド = '" & ABC & "')" END IF END IF です。 宜しくお願いします

  • VBでSQL

    SQLでテーブル1に該当レコードがなければインサート あればアップデートをする処理をしたいのです IF ??? THEN UPDATE テーブル1 SET SELECT * FROM テーブル2 WHERE 条件 ELSE INSERT INTO テーブル1(SELECT * FROM テーブル2) END IF ???はプライマリキーで判定をしようと考えています こんな感じでやろうとしたところ うまくいきませんでした VB上で実行しよううとしているからなのでしょうか? ADOでSQLサーバに接続しています 条件分岐もどういう条件(VBでの書き方)がわからないです。 よろしくお願いします。

  • SQL文の最後に「;」はいらないのでしょうか?

    VBAのADOについて質問です。 SQL文の最後には「;」を付けなくちゃいけないものだと思っているのですが ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Private Sub test_Click() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Set CN = CurrentProject.Connection Set RS = New ADODB.Recordset SQL = "SELECT * FROM Tテーブル" ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ でも問題なくコードが動きました。 SQL文の最後に「;」はいらないのでしょうか? ちなみに SQL = "SELECT * FROM Tテーブル;" でもエラーになりませんでした。

  • sql offset

    offsetやlimitをつけると 結果が表示されなくなります。 $sql='SELECT naiyo FROM zyoho WHERE cityid=? OR brandid=? だけのSQLだと結果は表示されるのですが。 解決方法をご教授お願いいたします。 下記はソースです。 $page=1; $limit=2; $offset = $limit * ($page - 1); $lastpage = ceil($total / $limit); if($brandid=='') { $sql='SELECT naiyo FROM zyoho WHERE cityid=? OR brandid=? ORDER BY `code` DESC LIMIT'.$limit.' OFFSET '.$offset.''; }else{ $sql='SELECT naiyo FROM zyoho WHERE cityid=? AND brandid=?ORDER BY `code` DESC LIMIT'.$limit.' OFFSET '.$offset.''; } $stmt=$dbh->prepare($sql); $data[]=$cityid; $data[]=$brandid; $stmt->execute($data); $dbh = null;

    • ベストアンサー
    • MySQL
  • ACCESSでSQL文を実行した結果を参照したいのですが。

    どなたか助けてください。 環境はWin98 ACCESS2000です。 画面で入力されたコードをもとに、そのコードがテーブルに存在した場合とない場合で次画面のフォームで処理を分けたいと考えています。そのため、SQLを実行した結果の別のコードを参照したいのですが、参照の仕方がわかりません。 コードの検索画面のクリック時のイベントプロシジャ内で Private Sub Cmd_Find_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Dim mySql As String Set db = CurrentDb() mySql = "SELECT T_Name FROM T_テーブル " _ & "WHERE T_Code = " & Frm_Code Set rs = db.OpenRecordset(mySql) If rs.EOF Then     ・・・ない場合の処理 Else Set Me.Recordset = rs →   ココでSELECT文で実行したT_Nameを参照したい End If Set rs = Nothing Set db = Nothing End Sub T_テーブル内にT_NameとT_Codeがあり フォームのテキストボックスの値のFrm_Codeを条件に検索した結果のT_Nameを参照したいのです。 フォームは非連結で処理を行いたいのですが、どのように参照すればいいのでしょうか。本で調べたところ、普通にT_Nameを使っているのですがうまくいきません。 どなたか下手な説明で申し訳ありませんがお願いします。

  • ストアド内で実行したSQLの出力結果について

    現在、引数の値を元に下記のようなSQL文を生成しています。 SELECT code, name FROM T_CGY WHERE code = '1111' UNION SELECT code, name FROM T_CGY WHERE code = '1110' UNION SELECT code, name FROM T_CGY WHERE code = '1100' UNION SELECT code, name FROM T_CGY WHERE code = '1000' ORDER BY code; ※出力されたSQL文に誤りがないかを確認する為にコピーしてターミナル上で実行したら該当するレコードを取得する事ができました。 それをストアドプロシージャ内で生成したSQL文を「QUERY EXECUTE」を実行して該当するレコードが取得できるように改造してみました。 下記が出力された結果です。 getCgyData -------------------- (1000,洋服) (1100,子供服) (1110,ズボン) (1111,長ズボン) 出力されたデータは私が望んだ内容なんですが・・・ 私的には下記のように出力したいと考えています。 col1    | col2 ------------------------- 1000  | 洋服 1100  | 子供服 1110  | ズボン 1111  | 長ズボン 何とか上記のように出力できるようにするにはどうしたらいいでしょうしょうか。 そもそも上記のように出力する事は可能なのでしょうか。 CREATE FUNCTION getCgyData (VARCHAR) RETURNS TABLE(col1 VARCHAR, col2 VARCHAR) AS ' DECLARE key ALIAS FOR $1; sql TEXT; BEGIN                 ・                 ・ ※ここでSQL文を生成して、変数(sql)に格納しています。                 ・                 ・ RETURN QUERY EXECUTE sql; END; ' language 'plpgsql' ; データベースのバージョンはpostgreSQL8.4.9です。 再度、申し訳ありませんがアドバイス、宜しくお願いします。 では、失礼します。

  • SQLの結果が返ってこない

    PHP+mysqlで以下のようなSQL文で処理を行ったのですがデータが返ってきません。 $sql = 'SELECT * FROM books WHERE id=3'; $recordSet = mysql_query($sql); if(mysql_fetch_assoc($recordSet)){ while ($table = mysql_fetch_assoc($recordSet)) {        処理     } } mysqlの画面で SELECT * FROM books WHERE id=3 を入力してみるとしっかりと結果が返ってきます。 ちなみに1行目を、違うテーブルの $sql = 'SELECT * FROM podcast WHERE code=3 ORDER BY dcdate DESC LIMIT 0,3'; にしてみると、データが表示されます。 2日間かけてずっと試行錯誤してみたのですが、完全に行き詰ってしまったので、何か考えられる原因はありませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • SQLチューニングについて

    以前別のサイトで質問し、一旦は解決したつもりでしたが、クライアントから再度条件を 突きつけられてしまい、投稿させて頂きました。 (そちら側のサイトでは完了にしてあります。これがマルチスレッドにあたるならご指摘下さい。) -------------------------------------------------------------------- 現在ACCESSにてデータ出力を行なっておりますが、パフォーマンスが出なく悩んでおります。 環境:Windows XP + Access 2003 テーブルA(約18000件) 項目s 項目t 項目u 項目v ★やりたいこと  テーブルAのうち、項目s,t,uを集約して、集約結果が1件のものを  対象に全ての項目(s~v)を出力したい。 ★現在作成中のSQL SELECT sub02.s, sub02.t, sub02.u, sub02.v FROM テーブルA AS sub02 INNER JOIN ( SELECT s, t, u FROM テーブルA GROUP BY s, t, u HAVING COUNT(s) = 1 ) AS Sub01 ON Nz(sub01.s)=Nz(sub02.s) AND Nz(sub01.t)=Nz(sub02.t) AND Nz(sub01.u)=Nz(sub02.u) 上記SQLで実行すると8~10分程度掛かってしまいます。 結合条件のNZ関数については、どうしてもnullが入る項目がある為に この様にしてしております。 どなたかお知恵を拝借願いたいと思います。