36

1つのテーブルからデータを取得して新しいテーブルにコピーするT-SQLクエリがありますが、特定の条件を満たす行のみです。

SELECT VibeFGEvents.* 
INTO VibeFGEventsAfterStudyStart 
FROM VibeFGEvents
LEFT OUTER JOIN VibeFGEventsStudyStart
ON 
    CHARINDEX(REPLACE(REPLACE(REPLACE(logName, 'MyVibe ', ''), ' new laptop', ''), ' old laptop', ''), excelFilename) > 0
    AND VibeFGEventsStudyStart.MIN_TitleInstID <= VibeFGEvents.TitleInstID
    AND VibeFGEventsStudyStart.MIN_WinInstId <= VibeFGEvents.WndInstID
WHERE VibeFGEventsStudyStart.excelFilename IS NOT NULL
ORDER BY VibeFGEvents.id

テーブルを使用するコードはその順序に依存しており、上記のコピーは私が期待した順序を保持していません。つまり、新しいテーブルの行は、からコピーされVibeFGEventsAfterStudyStartた列で単調に増加していません。VibeFGEventsAfterStudyStart.idVibeFGEvents.id

T-SQLで、からの行の順序をどのように保持できますVibeFGEventsVibeFGEventsStudyStart

4

9 に答える 9

25

What for?

Point is – data in a table is not ordered. In SQL Server the intrinsic storage order of a table is that of the (if defined) clustered index.

The order in which data is inserted is basically "irrelevant". It is forgotten the moment the data is written into the table.

As such, nothing is gained, even if you get this stuff. If you need an order when dealing with data, you HAVE To put an order by clause on the select that gets it. Anything else is random - i.e. the order you et data is not determined and may change.

So it makes no sense to have a specific order on the insert as you try to achieve.

SQL 101: sets have no order.

于 2013-01-20T13:53:40.790 に答える
2

私は MS SQL 2012 でテストを行いましたが、insert into ... select ... order by が理にかなっていることを明確に示しています。これが私がしたことです:

create table tmp1 (id int not null identity, name sysname);
create table tmp2 (id int not null identity, name sysname);

insert into tmp1 (name) values ('Apple');
insert into tmp1 (name) values ('Carrot');
insert into tmp1 (name) values ('Pineapple');
insert into tmp1 (name) values ('Orange');
insert into tmp1 (name) values ('Kiwi');
insert into tmp1 (name) values ('Ananas');
insert into tmp1 (name) values ('Banana');
insert into tmp1 (name) values ('Blackberry');

select * from tmp1 order by id;

そして、私はこのリストを得ました:

  • りんご1個
  • 2 にんじん
  • 3 パイナップル
  • 4 オレンジ
  • 5 キウイ
  • 6 アナナス
  • 7 バナナ
  • 8 ブラックベリー

ここで驚きはありません。次に、この方法で tmp1 から tmp2 にコピーを作成しました。

insert into tmp2 (name)
select name
from tmp1
order by id;

select * from tmp2 order by id;

以前のように正確な応答が得られました。アップルからブラックベリー。順序を逆にしてテストします。

delete from tmp2;

insert into tmp2 (name)
select name
from tmp1
order by id desc;

select * from tmp2 order by id;
  • 9 ブラックベリー
  • 10 バナナ
  • 11 アナナス
  • 12 キウイ
  • 13 オレンジ
  • 14 パイナップル
  • 15 にんじん
  • 16 アップル

したがって、tmp2 の順序も逆になるためターゲット テーブルにID 列がある場合は順序付けが適切です。

于 2020-08-25T08:16:46.590 に答える
-1

INSERT INTOの代わりに使用してみてくださいSELECT INTO

INSERT INTO VibeFGEventsAfterStudyStart 
SELECT VibeFGEvents.* 
FROM VibeFGEvents
LEFT OUTER JOIN VibeFGEventsStudyStart
ON 
    CHARINDEX(REPLACE(REPLACE(REPLACE(logName, 'MyVibe ', ''), ' new laptop', ''), ' old laptop', ''), excelFilename) > 0
    AND VibeFGEventsStudyStart.MIN_TitleInstID <= VibeFGEvents.TitleInstID
    AND VibeFGEventsStudyStart.MIN_WinInstId <= VibeFGEvents.WndInstID
WHERE VibeFGEventsStudyStart.excelFilename IS NOT NULL
ORDER BY VibeFGEvents.id`
于 2013-01-20T14:03:13.130 に答える