2

もちろん、フィールド名を明示的に使用せずに、キーではなく行を複製したいと思います。
SQLの方法はありますか、それともコードを介してフィールド名を列挙する必要がありますか?

コードとデータベースの依存関係を最小限に抑えたいので、フィールド名を明示的に使用したくありません。

MsAccess2003で使用します。標準的な方法が存在しない場合に備えて説明します。

4

7 に答える 7

5
INSERT INTO `<table>` (column1, column2, ...) -- Not IDENTITY columns
SELECT column1, column2, ... FROM ...

これにより、主キー列などに置換値を挿入することもできます。私はこれを一般的なテーブル式と共に使用して、2 月から一連のテスト データを取得し、それらが実際に6月から。

フィールド名なしでやりたいと言ったのは知っていますが、できないと思います。また、列の順序に縛られるため、これもお勧めできません。

于 2009-07-06T13:39:49.243 に答える
3

心配するユニークなものがない場合:

INSERT INTO <table> (SELECT * FROM <table> WHERE <condition>)

そうでなければ、ジョン・サンダースの答えはおそらくあなたの最善の策です。

于 2009-07-06T13:32:35.067 に答える
0

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
于 2009-07-08T10:06:52.953 に答える
0

主キーフィールドに自動識別子がある場合は、PKにないフィールドについてシステムに問い合わせ、そうでないフィールドに既存の値を使用して、それらのフィールドのみを挿入する(または挿入する)スクリプトを作成できる可能性がありますnull。 PKフィールド)。

したがって、「標準的な」方法はないと思います。

于 2009-07-06T13:35:31.837 に答える
0

私は Access のユーザーではありませんが、SQL Server では、SQL Server Management Studio で [テーブルをスクリプト化 --> 挿入先] を選択できます。これを簡単に変更して、必要な行を INSERT INTO SELECT ステートメントにフィルター処理できます。

おそらく、このようなものはAccessに存在しますか?

于 2009-07-06T13:41:16.090 に答える
0

人々が私の前に述べたように、「INSERT INTO TBL SELECT * FROM TBL WHERE X=Y」を実行すると、1 行が得られます。主キーがある場合、これは失敗します。

PK がない場合は、より大きな問題が発生する可能性があります。

これはリンクされたテーブルですか?その場合、ODBC リンクを扱っているため、データベースの依存関係はありません。その場合、これを使用してテーブルの列のリストを簡単に取得できます。

SELECT TOP 0 * FROM TBL (リンクされた tbl ではサーバーへの往復が必要です)
空のレコードセットを取得し、列を反復処理するだけです。

于 2009-07-06T13:43:23.857 に答える
0

置換値を指定するときは、キーのフィールド名を明示的に指定する必要があるため、「標準的な」方法は単に不可能です。

...すべてのテーブルに単一のキーがあり、すべて同じ名前 (ID が一般的) であり、各キーが IDENTITY (autonumber) プロパティを持つ単一の列で構成されている場合を除きます。この場合、実際にはキーはありません。 IDENTITY 値を使用して重複行を一意に識別する方法にすぎません。

于 2009-07-08T10:47:33.510 に答える