マルシェル新規登録で5000円分当たる

Accessで作ったクエリで表示されるデータと、VBAでSQLを組んでそのクエリから抽出したデータが異なるので困っています。

ちょっと言葉では説明しにくいので表で説明します。

元となるテーブル(t_test)がたとえば以下のようになっているとします。

t_test
顧客id  商品id
1      A-1
2      A-2
3      B-1
4      A-1

これを元に、以下のようなクエリ(q_test)を作ります。

q_test
顧客id  商品id  式1: IIf([商品id] Like "A*",1,0)
1      A-1    1
2      A-2    1
3      B-1    0
4      A-1    1

VBAで以下のようなSQLを実行すると、なぜか式1の値が全て0となります。

sql = "SELECT * FROM q_test"
1      A-1    0
2      A-2    0
3      B-1    0
4      A-1    0

式1でLIKEを使っていることが原因なのか、
IIf([商品id] = "A-1",1,0)
とかだと、クエリとSQLの結果に違いはありません。
IIfだけでなくSwitchを使った場合も同様(LIKEだとおかしい、=だと平気)でした。

ちなみに、Accessのバージョンは2003、VBAで使っているレコードセットはADODBです。
(今確認したところ、DAOでは問題なくできました。)

冒頭で、困っていると書きましたが、これを回避する方法はいくつか思いついていますので、
別の方法を教えていただきたいわけではなく、単純になぜこのようなことが起きるのかが知りたいです。
是非よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> Like "A*"



ADO では Like "A%" になると思います。

こういうことではなく、なぜかっていうことになりますか・・・


Access 2003 / 2007 で確認してみました。

Private Sub CheckDAO(sS As String, sSql As String)
  Dim rs As DAO.Recordset

  Set rs = CurrentDb.OpenRecordset(sSql)
  While (Not rs.EOF)
    Debug.Print "DAO" & sS & " : ",
    Debug.Print "顧客id=" & rs("顧客id"),
    Debug.Print "商品id=" & rs("商品id"),
    Debug.Print "式1=" & rs("式1")
    rs.MoveNext
  Wend
  rs.Close
  Set rs = Nothing
End Sub

Private Sub CheckADO(sS As String, sSql As String)
  Dim rs As New ADODB.Recordset

  rs.Source = sSql
  rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
  While (Not rs.EOF)
    Debug.Print "ADO" & sS & " : ",
    Debug.Print "顧客id=" & rs("顧客id"),
    Debug.Print "商品id=" & rs("商品id"),
    Debug.Print "式1=" & rs("式1")
    rs.MoveNext
  Wend
  rs.Close
End Sub

Public Sub test21()
  Const CSQL As String = "SELECT * FROM q_test;"
  Const CSQL2 As String = "SELECT * FROM q_test2;"

  Call CheckDAO("", CSQL)
  Call CheckADO("", CSQL)
  Call CheckDAO("2", CSQL2)
  Call CheckADO("2", CSQL2)
End Sub


クエリ q_test2 は、 A* を A% に変更しただけのもので、
test21 を実行した結果は以下

DAO : 顧客id=1 商品id=A-1 式1=1
DAO : 顧客id=2 商品id=A-2 式1=1
DAO : 顧客id=3 商品id=B-1 式1=0
DAO : 顧客id=4 商品id=A-1 式1=1
ADO : 顧客id=1 商品id=A-1 式1=0
ADO : 顧客id=2 商品id=A-2 式1=0
ADO : 顧客id=3 商品id=B-1 式1=0
ADO : 顧客id=4 商品id=A-1 式1=0
DAO2 : 顧客id=1 商品id=A-1 式1=0
DAO2 : 顧客id=2 商品id=A-2 式1=0
DAO2 : 顧客id=3 商品id=B-1 式1=0
DAO2 : 顧客id=4 商品id=A-1 式1=0
ADO2 : 顧客id=1 商品id=A-1 式1=1
ADO2 : 顧客id=2 商品id=A-2 式1=1
ADO2 : 顧客id=3 商品id=B-1 式1=0
ADO2 : 顧客id=4 商品id=A-1 式1=1

クエリを直接開いた時の表示は、

「q_test」
顧客id 商品id  式1
1    A-1    1
2    A-2    1
3    B-1    0
4    A-1    1

「q_test2」
顧客id 商品id  式1
1    A-1    0
2    A-2    0
3    B-1    0
4    A-1    0


ANSI-92 / ANSI-89 ・・・なんちゃらがあり
http://office.microsoft.com/ja-jp/access-help/HP …
(DAO / ADO の違いについてのお話ではないと思いますが・・・)

ツール→オプションを表示し、
「テーブル/クエリ」のSQLサーバー互換構文(ANSI 92)の
「このデータベース」のチェックを入れ、クエリを直接開くと結果は逆になります。
でも、DAO / ADO での取得(test21 の実行)結果は変わりません。

この辺の動きを説明されているのが以下でしょうか(拡大解釈かも)

ADOとDAOを使用したwhere句内の文字列検索にて、*と%の動きの違い
http://www.nurs.or.jp/~ppoy/access/access/acM012 …

クエリ名で指定しても、その内容の全ての解釈は統一された、
という事になるのでしょうか。(私の解釈ですけど)


うそかも・・・ 自己責任にて解釈してください。
    • good
    • 1

クエリのデザイングリッドのところでSQLビューを表示すると、SQL文がどういうようになっているか分かるのではないですか。


<--ここがミソ
そのSQL文を間違いなく写して
Sub test15()
Dim dbs As DAO.Database
Dim rs As DAO.Recordset

Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("select 氏名,住所 from 社員3")
rs.MoveFirst
Do Until rs.EOF
MsgBox rs!住所
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
dbs.Close: Set dbs = Nothing
End Sub
でselect 氏名,住所 from 社員3の部分を変えて
そのSQL文で実行して何かヒントが得られないですか。
(ちなみに上記は私のテストデータでは動きます。)
ADOでやるならSQL文で開くコードでやってみるとか。
    • good
    • 0

rodoniさん はじめまして。



私も同じようにAccess2003,EXCEL2003で作成し試してみました。
結論か言うと、ADOでもDAOも結果が同じでした。
※下記のプログラムと結果参照

参照設定(ADOのバージョン等)とか環境とか何か違いがあるのでしょうかね?
※DAOは3.6,ADOは6.0で確認

あまりお役に立てず、申し訳ありません。

以下、サンプルと結果です。
【DAO ソース】
Sub DAO_Access()
Dim objDtbs As DAO.Database
Dim objRcrd As DAO.Recordset

Set objDtbs = OpenDatabase(ThisWorkbook.Path & "\" & "test.mdb")
Set objRcrd = objDtbs.OpenRecordset("SELECT * FROM q_test", dbOpenForwardOnly)
With objRcrd
 Do While Not (objRcrd.EOF)
  Debug.Print "顧客id="; objRcrd.Fields("顧客id"),
  Debug.Print "商品id="; objRcrd.Fields("商品id"),
  Debug.Print "式1="; objRcrd.Fields("式1")
  objRcrd.MoveNext
 Loop
End With
objRcrd.Close
objDtbs.Close
Set objRcrd = Nothing
Set objDtbs = Nothing
End Sub
【DAO 結果】
顧客id=1 商品id=A-1 式1= 1
顧客id=2 商品id=A-2 式1= 1
顧客id=3 商品id=B-1 式1= 0
顧客id=4 商品id=A-1 式1= 1

【ADO ソース】
Sub ADO_Access()
 Dim adoCON As New ADODB.Connection
 Dim adoRS As ADODB.Recordset
 adoCON.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & ThisWorkbook.Path & "\" & "test.mdb"
 Set adoRS = adoCON.Execute("select * from q_test")
 Do While Not (adoRS.EOF)
  Debug.Print "顧客id="; adoRS("顧客id"),
  Debug.Print "商品id="; adoRS("商品id"),
  Debug.Print "式1="; adoRS("式1")
  adoRS.MoveNext
 Loop
 adoRS.Close
 adoCON.Close
 Set adoRS = Nothing
 Set adoCON = Nothing
End Sub
【ADO 結果】
顧客id=1 商品id=A-1 式1= 1
顧客id=2 商品id=A-2 式1= 1
顧客id=3 商品id=B-1 式1= 0
顧客id=4 商品id=A-1 式1= 1
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QACCESSのクエリで同じSQL文だが結果が異なる

ACCESS2003にて
選択クエリAをSQLビューで開きSQL文をコピー、
新規作成したクエリBのSQLビューに貼り付けて実行したところ、
AとBで結果の件数が異なりました。

そのままBを保存して終了。
BをSQLビューで開き、
SQL文の末尾の;を削除して実行すると、
Aと同じ件数の結果になりました。

再度Bを保存して終了し、
BをSQLビューで開き、
SQL文の末尾の;を削除して実行すると、
Aと異なる件数(元の結果)になりました。

何が原因なのでしょうか。
SQL文の内容は、サブクエリを含んでいて、サブクエリのFROMは
SQLSERVERのリンクテーブルです。

よろしくお願いします。

Aベストアンサー

文末のセミコロンの有無でSQLの結果が変わるというのは聞いたことがないなあ…
ちょっと遠回りだけど、2つの文で結果がどう異なるかをもう少し調べた方がよさそうです。
件数が異なる、ということはどちらかのSQLによって、本来抽出すべきデータが抽出されない、
または余分なデータが抽出されてしまう、ということが起きているはずです。
なので、両者の結果をテーブルにでも書き出して一方にしか含まれないデータを確認し、
そこから可能性を推測して、できれば検証(同じようなデータを追加して予想通りになるか)
といった手順を踏んでいくのが、遠いようで実は解決に近いかもしれません。

QVBAをつかってクエリの情報を抽出するには??

ACCESS VBAを使ってプログラムを組んでいるVBA初心者です。ヘルプやいろんなHPを参考にしているのですが、どうしてもわからないことがあるのでおしえてください。
クエリの情報をフォームの日付から抽出し、csvファイルを作成するというものを作ろうとしています。
クエリの抽出条件でフォームの日付の期間で抽出するようにしてあります。
VBAにてOpenRecordsetでクエリから情報を抽出しようとするのですがクエリがありませんとエラーをはかれてしまいます。クエリの指定方法がまちがっているのでしょうか?
また、以下の方法とは別の方法でクエリから抽出するやりかたがありましたら教えていただけませんでしょうか?よろしくお願いいたします。
以下にどのように記述しているか記します。
------------
Public Function value()
On Error GoTo ERRORRR
Set db = CurrentDb
Dim rs As Recordset

Set rs = db.OpenRecordset("[開通チェック]", dbOpenDynaset)
Debug.Print rs.EOF
Do Until rs.EOF
Debug.Print rs!ID
Debug.Print rs!登録状態
Debug.Print rs!開通年月日
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
Exit Function
ERRORRR:
msgbox Err.number & ":" & Err.description
End Function

--------
開通チェック:クエリ (開通年月日には Between [Forms]![開通チェック]![開始日] And [Forms]![開通チェック]![終了日] の抽出条件が書かれています。)

使用しているACCESS Ver:ACCESS97

ACCESS VBAを使ってプログラムを組んでいるVBA初心者です。ヘルプやいろんなHPを参考にしているのですが、どうしてもわからないことがあるのでおしえてください。
クエリの情報をフォームの日付から抽出し、csvファイルを作成するというものを作ろうとしています。
クエリの抽出条件でフォームの日付の期間で抽出するようにしてあります。
VBAにてOpenRecordsetでクエリから情報を抽出しようとするのですがクエリがありませんとエラーをはかれてしまいます。クエリの指定方法がまちがっているのでしょうか?
...続きを読む

Aベストアンサー

パラメータがあるクエリはパラメータをParametersで入れてあげないと開けません。
パラメータを読み取れないのでRecordsetにクエリを渡せない状態でエラーが出ていると思います。

Dim db as Database
Dim qd as QueryDefs
Dim rs as Recordset
Dim pr1 As Date, pr2 As Date

Set db = CurrentDb()

pr1 = Format(Forms("開通チェック")("開始日"), "yyyy/mm/dd")
pr2 = Format(Forms("開通チェック")("終了日"), "yyyy/mm/dd")

Set qd = db.QueryDefs("開通チェック")
qd.Parameters("pr1").Value = pr1
qd.Parameters("pr2").Value = pr2

Set rs = qd.OpenRecordSet() 'ここでRecordsetにクエリを渡します。

これでいけると思います。

パラメータがあるクエリはパラメータをParametersで入れてあげないと開けません。
パラメータを読み取れないのでRecordsetにクエリを渡せない状態でエラーが出ていると思います。

Dim db as Database
Dim qd as QueryDefs
Dim rs as Recordset
Dim pr1 As Date, pr2 As Date

Set db = CurrentDb()

pr1 = Format(Forms("開通チェック")("開始日"), "yyyy/mm/dd")
pr2 = Format(Forms("開通チェック")("終了日"), "yyyy/mm/dd")

Set qd = db.QueryDefs("開通チェック")
qd.Parameters("pr1")....続きを読む

QDAOとADOの違いについて

Accessからイントラネット上のデータベースに接続するための接続方法で困っています。
DAOとADOの違いが分からず困っています。
メリット、デメリットが分かる方、どうか教えてください。

宜しくお願い致します。

Aベストアンサー

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されているためJetデータベースエンジンの細かな機能を制御することができないといった点が不足している部分がありますがADOXやJROの各オブジェクトモデルで使用できる機能を使えばADOで不足している機能をほとんど補うことができます。
DAOはデータベースにAccessを使用するアプリケーションの場合、最大のパフォーマンスを得ることができます。しかしアプリケーションを運用していくうちに規模が大きくなってデータベースをSQLServerに移行することがあるかもしれません。
そのような可能性が含まれているのであれば最初からADOで開発しておいたほうが無難です。ADOはSQLServerに対する処理で良いパフォーマンスを得ることができます。

Jetデータベースエンジンを主なターゲットにしているならDAOで可。それ以外のデータベースを利用するのであればADOを選択する方が良いのではと思います。

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されて...続きを読む

QAccessのテーブルデータを一気にVBAで追加したい・・

Accessのテーブルデータを一気にVBAで追加したい・・

Accessに一時商品登録データというテーブルがあり、
問題なければ商品登録データにデータを流し込みたいと思っています

テーブルのデータ構造は全く同じです

VBAで一時商品登録のテーブルから一件ずつデータを読み取って
商品登録データに追加することは出来るのですが
一気にデータを追加する方法があれば教えていただけないでしょうか?

よろしくお願いいたいます

Aベストアンサー

本当にいろいろな方法があります。

一番簡単なのは、
あらかじめ「追加クエリ」を作成しておき

 Docmd.OpenQuery "追加クエリ名"

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute "追加クエリ名"

追加クエリを使用しない場合は
追加クエリの SQL文 に相当するSQL を 実行。

 strSQL="INSERT INTO 商品登録データ SELECT 一時商品登録データ.* FROM 一時商品登録データ"

 Docmd.RunSQL strSQL

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute strSQL

とか。

直書き、間違いがあったら御免。

Q「Nullの使い方が不正です」のエラー

AccsessとVB間でデータの参照・登録・削除を行うプログラムを作成中です。
テキストボックスにデータを入力せずに更新するとAccess側はNull値が入るので、参照をした際に
「Nullの使い方が不正です」のエラーが表示されます。

Null値が表示可能ならその方法を教えてください。

Aベストアンサー

読み込んだ際にIsNull()で判断してみては?
If IsNull(Fields) Then
Text1.Text = ""
Else
Text1.Text = Fields
End If

QAccessのDAO.ExecuteとDoCmd.RunSqlの違いについて

アクションクエリを実行する際、表題の2つを検討しています。
最重要な違いに同期と非同期であることをネットで検索して分かりました。
非同期だとどのような問題が発生するのか具体的に教えて頂けると助かります><

Aベストアンサー

DoCmd.RunSQL ですが、「非同期」であると幾つかのHPで見かけましたが、実際試してみると「同期」実行している感じです(Access2000で実験)。

実際「非同期」なんでしょうか?
オフィシャルなサイトに「非同期である」と言う記述はありますか?

------------検証プログラム------------
Sub local_test()
 Dim SQL(4) As String
 Dim t As Double

 SQL(1) = "UPDATE T1 SET Data = '0';"
 SQL(2) = "UPDATE T1 SET Data = '1';"
 
 SQL(3) = "UPDATE T2 SET Data = '0';"
 SQL(4) = "UPDATE T2 SET Data = '1';"
 
 '初期化
 CurrentDb.Execute SQL(1)
 CurrentDb.Execute SQL(3)

 'DoCmd.RunSQL テスト--------------------------------------------
 DoCmd.SetWarnings False
 t = Timer()
 DoCmd.RunSQL SQL(2)
 Debug.Print "DoCmd.RunSQL " & Format(Timer() - t, "0.00000")
 DoCmd.SetWarnings True

 'DAO.Execute テスト--------------------------------------------
 t = Timer()
 CurrentDb.Execute SQL(4)
 Debug.Print "CurrentDb.Execute " & Format(Timer() - t, "0.00000")
End Sub
---------------------------------------------------------

T1 T2 とも、3万件程度のテストデータが入っています。
DoCmd.RunSQL の方も処理が終わるまで返ってきません(同期実行では?)

DoCmd.RunSQL は SetWarnings を設定しないと、確認メッセージが出でます。
DoCmd.RunSQL が同期実行だとすると、これ以外に大きな違いは無いのかも知れませんね。


##########################################################
今度はADOを使って無理やり非同期実験
別のmdbにファイルにADOでアクセスしています。

------------検証プログラム------------
Sub ado_test()
 Dim cnn(2) As New ADODB.Connection
 Dim SQL(6) As String
 Dim dbName As String
 Dim t As Double

 dbName = "c:\temp\db1.mdb"

 SQL(1) = "UPDATE T1 SET Data = '0';"
 SQL(2) = "UPDATE T1 SET Data = '1';"
 SQL(3) = "UPDATE T1 SET Data = '2' WHERE Data = '1';"
 
 SQL(4) = "UPDATE T2 SET Data = '0';"
 SQL(5) = "UPDATE T2 SET Data = '1';"
 SQL(6) = "UPDATE T2 SET Data = '2' WHERE Data = '1';"
 
 cnn(1).Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & dbName & ";"
 cnn(2).Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & dbName & ";"
 
'初期化
 cnn(1).Execute SQL(1)
 cnn(1).Execute SQL(4)

'同期実行テスト--------------------------------------------
 t = Timer()
 cnn(1).Execute SQL(2)
 cnn(1).Execute SQL(3)
 Debug.Print "同期実行  " & Format(Timer() - t, "0.00000")

'非同期実行テスト--------------------------------------------
 
 t = Timer()
 cnn(1).Execute SQL(5), , adAsyncExecute
 cnn(2).Execute SQL(6), , adAsyncExecute
 Debug.Print "非同期実行 " & Format(Timer() - t, "0.00000")
End Sub
---------------------------------------------------------
非同期の方が明らかに速いです。(処理を待たずに返ってくるので)
非同期の方は正しく更新できてません。

この検証プログラムが正しいのか?、あまり自信はありません(^^;
参考程度にして下さい。

##########################################################
補足
DAOかADOか?

http://www.naboki.net/access/heaven/heaven_14.html
http://homepage2.nifty.com/inform/vbdb/daoado.htm

DoCmd.RunSQL ですが、「非同期」であると幾つかのHPで見かけましたが、実際試してみると「同期」実行している感じです(Access2000で実験)。

実際「非同期」なんでしょうか?
オフィシャルなサイトに「非同期である」と言う記述はありますか?

------------検証プログラム------------
Sub local_test()
 Dim SQL(4) As String
 Dim t As Double

 SQL(1) = "UPDATE T1 SET Data = '0';"
 SQL(2) = "UPDATE T1 SET Data = '1';"
 
 SQL(3) = "UPDATE T2 SET Data = '0';"
 SQL(4) = "UPD...続きを読む

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

QSQLの速度をあげるには・・・

テキストファイルからキーワードを拾って
SQLをなげています
SQLの質問になってしまうかもしれません
いまはADO接続でやっています

Open ファイル as input......

SQL = select * from tbl where name like '%キーワード%'
execute(SQL)

レコードセットの値で処理をいろいろ・・・
Loop

もともとのDBの件数がものすごくおおくてselect文に結構な時間が
かかってしまいます。速度をあげるほうほうってあるのでしょうか
私にはおもいつかなくて・・・

こういったほうほうは どう? ってのがありましたら
おしえていただきたいのですが よろしくおねがいします。

Aベストアンサー

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

まぁ愚痴っても仕方ないか・・・


なのでぼくも(不本意ながら)Like演算子を使用しています。


長い前置きはさておき・・・

本題のSQLのスピードなのですが、
http://homepage2.nifty.com/inform/vbdb/addnew.htm
こちらに面白い記述がありました。

AddNewにかかるスピードの検証で
Access データベースの場合: AddNew のほうが INSERT INTO より5倍以上速い
SQL Server の場合: INSERT INTO のほうが AddNew より 1.4倍 くらい速い
とあります。


たぶんで物を言ってはいけないと思うけど、言っちゃいます。

(1)もしDBがアクセスで
 >レコードセットの値で処理をいろいろ・・・
 のところがUpdate用のSQL文で処理を行ってる場合

 Recordsetをして、処理を行う


(2)もしDBがアクセス以外で
 >レコードセットの値で処理をいろいろ・・・
 のところがRecordsetで処理を行ってる場合

 Recordsetをせずに、UPDATE用のSQLを実行する


未検証なのですが多分イメージとして、こういうパターンが各DBに適してるのかな?

すでにこのパターンなのであれば、意味ないですね(^^;)

参考URL:http://homepage2.nifty.com/inform/vbdb/addnew.htm

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング