selectして別のテーブルにINSERTするCREATEなしで、EXCEPT差分

まとめ
(1)新規テーブルに別のテーブルのデータをコピーしたい
select * into newtable from table where (条件)
この場合、同じクエリを実行するとすでにnewtableがあるよエラーになるので初回だけ使える
つまり、すでにnewtableが存在するときは使えない。
CREATE TABLEをしなくてもnewtableが作成されるので手間を省ける

(2)すでに存在するテーブルに別のテーブルからコピーしたい
insert into anotherTable select 列 from table where (条件)
(例)INSERT INTO newMember SELECT * FROM Member

<(1)の場合の例>
Memberテーブルがあったとする(name,age,cityの列)
このテーブルと同じテーブルを作りたい。
使い方は、クエリを書いていて、他のクエリに改良したときに、出力内容が同じかを確かめたいときに、それぞれのクエリのSELECT出力を新しいテーブルに入れる。
そして、2つ(もしくは3つとか)のテーブルを下記のEXCEPTで比較して0件なら同じ出力と言える。
数百行程度なら出力内容をコピーしてエクセルに貼り付ければよいが、これが10万件とかだとエクセルに貼り付けて確認するのも面倒になる。
そこで、SQLManagementStudioで確認できればそれが早い

テーブルを作ってデータを入れて確認したいときに、いちいちCREATE TABLEして列と型を書いて、、、とするとイライラするので無駄な手順が省けると非常に助かる。
でも一部の列だけの情報がほしいときは結局はCREATE TABLEでテーブル定義必要だったりする。

member一覧
member:もともとのテーブル
newmember:memberから新しいテーブルを作る

SELECT TOP 10 * FROM MEMBER
SELECT * INTO newMember FROM Member--これでCREATE TABLEを実行しなくても	newmemberテーブルが作成される。なおすでにテーブルが存在すると既にテーブルがあるよエラーになる。
--ただし、インデックスとかもろもろの設定はつかないのであくまでもデータを一時的に使いたいときに使うらしい
select * FROM newMember

[select * into newtable from table]はすでにテーブルが存在すると既にテーブルがあるよエラーになる。
–すでにテーブルが存在するときは

INSERT INTO newMember SELECT * FROM Member

INSERT INTOを使う

すでにテーブルが存在するのにSELECT INTOを使うとエラーになる。
すでにあるよエラー
EXCEPTで差分を調べる。同じ列である必要がある

--EXCEPTで2つのテーブルの差を検索する。これで0件なら一致
SELECT * FROM Member
EXCEPT
SELECT * FROM newMember

テーブル同士で差分を調べる

--LEFT OUTERで差分を調べる。NULLがあれば差がある
SELECT * FROM Member LEFT OUTER JOIN newMember ON Member.name = newMember.Name

SELECT * FROM Member LEFT OUTER JOIN newMember 
ON Member.name = newMember.Name
WHERE
	Member.name IS NULL or Member.age IS NULL or Member.City IS NULL
	--0件ならさいがないと思う

–NewMemberの一部を変更してみた

UPDATE newMember
SET City = 'a'
WHERE
	NAME = '坂本' AND Age = 19 AND City = '東京'

select * from newMember
/*
Name	Age	City
坂本	19	a  >>ここを変えた
中原	50	大阪
山岡	6	東京
赤橋	42	北海道
西	69	大阪
*/

SELECT * FROM Member
EXCEPT
SELECT * FROM newMember
/*
結果はmemberテーブルの坂本さんが違うと出力される
Name	Age	City
坂本	19	東京
*/

またテーブルのみならず
SELECTで出力した内容を挿入したいときは
–FROM のテーブルをSELECTで出力して新規テーブルに挿入する場合は別名にする
–別名にしないと警告が出る

SELECT * into tmp01 FROM (
	SELECT * FROM Member WHERE Age > 20
) as ab

それか、一旦別のテーブルに入れてからさらに、SELECT INTOしてもよいかも

こちらの記事もどうぞ