sqlserverで
select * into tableA from (select * from tableB order by columnC asc)
はサブクエリでorder byは無効ですとエラーになりますがaccessでのクエリなら問題ない
selectした結果でupdate; accessの場合
以前
update tableA set
columnA=tableB.columnB
from tableA
inner join tableB
on tableA.ID=tableB.ID
とクエリ書いたけど、これはaccessのクエリでは通用しなかった。
sqlserverとは違うようです。
accessでは
update tableA inner join tableB on tableA.ID=tableB.ID
set
columnA=tableB.columnB
こちらが自然な気がする
update case文とトリガー
テーブルにupdateトリガーを仕込んで更新日時カラムをcurrent_timestampにupdateさせている状態で
update TableName set TargetColumn=case when OtherColumn=’abc’ then ‘D’ else TargetColumn end
で更新すると更新日時カラムは全レコード現在時刻に変更される
更新クエリの前に
Alter table TableName disable trigger TriggerName
クエリの後に
Alter table TableName enable trigger TriggerName
トリガーは楽な反面、仕込んでいるのを忘れてしまう
今日見直すとこの更新クエリ結局全部更新?
where句でupdate の方が断然速い
なんでもcase で条件分岐すれば良いというわけではないらしい
集計クエリ カウント
重複は除外してカウント、重複あっても全カウント 両方出したいとき
SQLserver、MySQLなら
select GroupColumn,Count(distinct TargetColumn),Count(TargetColumn) from Table group by GroupColumn
と簡単に出る
ACCESSでは?
このクエリはACCESSではできないようなのでいろいろ試したが今のところクエリ一文ではできていない
一度クエリでカウントして保存してさらにこれをソースにカウントしたカラムをカウントする のイメージで….
select GroupColumn as Group1,Count(TargetColumn) as Count1 from Table group by GroupColumn,TargetColumn
これをQ_1で保存して
select Group1,Count(Count1) as CountDistinct from Q_1 group by Group1
これでdistinct countができる
もう一つ全カウント
select GroupColumn as Group1,Count(TargetColumn) as CounAll from Table group by GroupColumn
のクエリQ_2を保存して
Q_1、Q_2 の連結クエリを作成する の2段構え
もっといい方法があるのかもしれないが今のところこれしか思いつかない
バックエンドがSQLserverやMySQLならACCESSから一番上のパススルークエリの方が楽かな?
MySQLでDBテーブル文字コード一覧するクエリ
select table_name,table_collation,table_schema from information_schema.tables where table_schema=’DB名’;
MERGE
二つのテーブルを比較し同じレコードが
あればupdate なければinsert
VBAでならレコードセット取っていろいろとやってれば
できるんでしょうが長くなるしAccess上でとなると時間もかかりそうな
のでSQLServerでしたい
となるとMERGEという事になるらしいです。
クエリ一文で済みます、たぶん。
merge into dbo.TableA as A
using dbo.TableB as B
on
(A.ID=B.ID)
when matched then
update set
name=B.name,
kana=B.kana,
Email=B.Email
when not matched then
insert(id,name,kana,email)
values(
B.ID,
B.name,
B.kana,
B.Email
)
;
肝はIDが一意であるという事ですがDBで一意となると自然増加のIDに
なっている事が多いでしょうからTableAの自然増加は外す
それとやはりSQLServerとMySQL間でMERGEは無理なのでテーブルを
移行させておく準備が必要
updateとinsertを同時に行うのでupsertともいうらしい
selectした結果でupdate
これも下と併せて覚えておきたい
update tableA set
columnA=tableB.columnB
from tableA
inner join tableB
on tableA.ID=tableB.ID
selectした結果をinsert
これもその度に検索しますがもういい加減に覚えたい
selectした結果をinsert
tableBからselectしてtableAへ
insert into TableA(column1,column2,column3)
select カラム1,カラム2,カラム3 from tableB
where 条件;