もちろん、フィールド名を明示的に使用せずに、キーではなく行を複製したいと思います。
SQLの方法はありますか、それともコードを介してフィールド名を列挙する必要がありますか?
コードとデータベースの依存関係を最小限に抑えたいので、フィールド名を明示的に使用したくありません。
MsAccess2003で使用します。標準的な方法が存在しない場合に備えて説明します。
7 に答える
INSERT INTO `<table>` (column1, column2, ...) -- Not IDENTITY columns
SELECT column1, column2, ... FROM ...
これにより、主キー列などに置換値を挿入することもできます。私はこれを一般的なテーブル式と共に使用して、2 月から一連のテスト データを取得し、それらが実際に6月から。
フィールド名なしでやりたいと言ったのは知っていますが、できないと思います。また、列の順序に縛られるため、これもお勧めできません。
心配するユニークなものがない場合:
INSERT INTO <table> (SELECT * FROM <table> WHERE <condition>)
そうでなければ、ジョン・サンダースの答えはおそらくあなたの最善の策です。
MsAccess2003指向のソリューション
ユーザーがボタンを押して現在のレコードの新しいバージョンを作成できるフォームがあります。
MsAccessのその部分は簡単です。
DoCmd.GoToRecord , , acNewRec
次に、キー、つまり「id」フィールドを除くフォームのすべてのフィールドを他のレコードのデータで更新する必要があります(コントロールはテーブルフィールドにバインドされています)。
私は以下のルーチンを思いつきました、それは私にとってうまくいきました:
Private Sub UpdateRow(tblname As String, key_name As String, key_value As String)
Dim Rst As Recordset
Dim field As field
Set DB = CurrentDb
Set Rst = DB.OpenRecordset("select * from " & tblname & " where " & _
key_name & "=" & key_value, dbOpenDynaset)
For Each field In Rst.Fields
If field.Name <> key_name Then
Form(field.Name) = field
End If
Next field
Rst.Close
Set Rst = Nothing
Set DB = Nothing
End Sub
そして、私はそれを次のように使用します:
DoCmd.GoToRecord , , acNewRec
UpdateRow "TableName", "KeyName", "some_previous_key_value"
Form.Refresh
主キーフィールドに自動識別子がある場合は、PKにないフィールドについてシステムに問い合わせ、そうでないフィールドに既存の値を使用して、それらのフィールドのみを挿入する(または挿入する)スクリプトを作成できる可能性がありますnull
。 PKフィールド)。
したがって、「標準的な」方法はないと思います。
私は Access のユーザーではありませんが、SQL Server では、SQL Server Management Studio で [テーブルをスクリプト化 --> 挿入先] を選択できます。これを簡単に変更して、必要な行を INSERT INTO SELECT ステートメントにフィルター処理できます。
おそらく、このようなものはAccessに存在しますか?
人々が私の前に述べたように、「INSERT INTO TBL SELECT * FROM TBL WHERE X=Y」を実行すると、1 行が得られます。主キーがある場合、これは失敗します。
PK がない場合は、より大きな問題が発生する可能性があります。
これはリンクされたテーブルですか?その場合、ODBC リンクを扱っているため、データベースの依存関係はありません。その場合、これを使用してテーブルの列のリストを簡単に取得できます。
SELECT TOP 0 * FROM TBL (リンクされた tbl ではサーバーへの往復が必要です)
空のレコードセットを取得し、列を反復処理するだけです。
置換値を指定するときは、キーのフィールド名を明示的に指定する必要があるため、「標準的な」方法は単に不可能です。
...すべてのテーブルに単一のキーがあり、すべて同じ名前 (ID が一般的) であり、各キーが IDENTITY (autonumber) プロパティを持つ単一の列で構成されている場合を除きます。この場合、実際にはキーはありません。 IDENTITY 値を使用して重複行を一意に識別する方法にすぎません。