限定しりとり

フィールド1,フィールド2,フィールド3,フィールド4
フィールド1はID番号です。

フィールド4が条件に一致するレコードだけを、同じテーブル内に追加コピーするSQLはどう記述したらよろしいでしょうか?

1,長嶋,100,巨人
2,王,80,巨人
3,野村,90,ヤクルト

フィールド4の条件 =巨人 として追加したい

1,長嶋,100,巨人
2,王,80,巨人
3,野村,90,ヤクルト
4,長嶋,100,巨人
5,王,80,巨人

A 回答 (1件)

> フィールド1はID番号です。



ということは、オートナンバという事を言いたかったのでしょうか
オートナンバであれば、以下の SQL でいけると思います

INSERT INTO テーブル名(フィールド2,フィールド3,フィールド4)
SELECT フィールド2,フィールド3,フィールド4 FROM テーブル名
WHERE フィールド4='巨人';


オートナンバ、いやいや自分で採番・・・テーブルによってはいろいろあると思います
いろいろ対応できるかな・・・ というものを作ってみました

Public Sub fncRecCopy(sTable As String, sFld As String _
          , Optional bAn As Boolean = False _
          , Optional sWheres As String = "")

というインターフェイスになるのですが、
使い方(指定方法)は、

sTable : テーブル名
sFld : フィールド名の列挙 (,)カンマ区切り
     先頭が採番するフィールド
bAn : その先頭のフィールドがオートナンバなら True を指定(既定:False)
sWheres : 抽出条件以降の記述(既定:条件なし)


Call fncRecCopy("テーブル名", "フィールド1,*", True, "フィールド4='巨人'")
とすると、前述SQLでの処理と同じになります
※ 処理性能は、SQL一発の場合より遅くなります

フィールド1 がオートナンバでなければ
Call fncRecCopy("テーブル名", "フィールド1,*", False, "フィールド4='巨人'")
とすれば、フィールド1 を採番します
フィールド部分の列挙を
"フィールド1,*"
↓ではなく
"フィールド1,フィールド3,フィールド4"
とした場合、指定されたフィールド部分しかコピーしません
コピーするレコードの順が必要なら、条件以降に ORDER BY 記述します
"フィールド4='巨人'"
↓例えば
"フィールド4='巨人' ORDER BY フィールド1"

※ 汎用的にするには
・Where 指定と、
・ORDER BY 指定は
分けた方が良いんでしょうけど

標準モジュールに記述して利用します

Public Sub fncRecCopy(sTable As String, sFld As String _
          , Optional bAn As Boolean = False _
          , Optional sWheres As String = "")
  Dim rs As New ADODB.Recordset
  Dim rsC As ADODB.Recordset
  Dim sSql As String
  Dim i As Long, j As Long
  Dim iM As Long

  sSql = "SELECT " & sFld & " FROM " & sTable
  If (Len(sWheres) > 0) Then
    sSql = sSql & " WHERE " & sWheres
  End If
  sSql = sSql & ";"

  If (Not bAn) Then iM = DMax(Split(sFld, ",")(0), sTable)
  rs.Open sSql, CurrentProject.Connection, adOpenStatic, adLockOptimistic
  Set rsC = rs.Clone
  For i = 1 To rs.RecordCount
    rsC.AddNew
    For j = 1 To rs.Fields.Count - 1
      rsC(j) = rs(j)
    Next
    If (Not bAn) Then
      iM = iM + 1
      rsC(0) = iM
    End If
    rsC.Update
    rs.MoveNext
  Next
  rsC.Close
  Set rsC = Nothing
  rs.Close
End Sub

※ エラー処理は入れてません
※ 不都合あれば、変更するとか・捨てるとかしてください
エラーがあったら、エラー番号を返す様に Function にするとか・・・
    • good
    • 0
この回答へのお礼

他のテーブルからデータコピーするのと同じで良かったのですね。

汎用モジュール
今回はオートナンバーですが、こちらもグッドタイミングで他に使わせて頂きます。
誠にありがとうございました。

お礼日時:2014/01/19 21:45

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