SQL Server 一時テーブル・テーブル変数・共通テーブル式(CTE)

一時テーブル,テーブル変数,共通テーブル式(CTE)の使い方


一時テーブル


— 一時テーブルはtempdbに格納される
— 名前の先頭に#1つ:ローカル一時テーブル(セッション内のみ)
名前の先頭に#2つ:グローバル一時テーブル(全ユーザーが使用可)

— 一時テーブル作成
SELECT *
 
INTO #tempA –グローバル一時テーブルの場合は ##tempA
 
FROM table1

— 何らかの処理
SELECT * FROM #tempA

— 一時テーブル削除
–通常は自動的に削除されるので必要ないがManagement Studioのクエリウインドウなどで繰り返し実行するときは必要
DROP TABLE #tempA


テーブル変数


— 宣言されたスコープ内で有効

— テーブル変数宣言(定義)
Declare
 
@T1 Table(
   
ID int identity(1,1) –ID用に1から順番に番号を付けたい場合
   
, a1 int
   
, a2 nvarchar(50)
   
, PRIMARY KEY (a1)
)

— テーブル変数にデーターを挿入(SELECT ~ INTO文は使用できない)
INSERT INTO @T1 (a1, a2)
 
SELECT a1, a2
 
FROM table1

— 何らかの処理(FROM句以外では別名を使用する必要がある)
SELECT * FROM @T1 AS T

— 自動的に削除されるので削除の必要はない


共通テーブル式(CTE)

SELECT文が入れ子になってわけがわからなくなるのを防げる

;WITH CTE1 (a1, a2)
AS
(
    SELECT a1, a2
        FROM Table1
        GROUP BY a1, a2
        –CTE内では ORDER BY は使えない
)

SELECT T1.a1, T2.b1
    FROM CTE1 AS T1
    INNER JOIN Table2 AS T2 ON T1.a1 = T2.a1
    ORDER BY T1.a1

–CTEは直後のクエリーでしか使えないので以降のクエリーではエラーとなる

SELECT * FROM CTE1 –エラー

–カンマで区切れば連続してCTEを参照できる

;WITH
CTE1 (a1, a2)
AS
(
  SELECT a1, a2
  FROM Table1
  GROUP BY a1, a2
),
CTE2 (b1, b2)
AS
(
  SELECT MIN(a1), MAX(a2)
  FROM CTE1 –CTE2の中でCTE1を使用
)
SELECT b1, b2
FROM CTE2


参考:
テーブルの作成と変更の基礎(MSDN)
共通テーブル式(MS)
共通テーブル式の使用(MSDN)

Updated:
2009-12-10 共通テーブル式を追加.

TeeChart 座標位置から画面上のピクセル位置を取得,ピクセル位置からグラフ上の座標位置を取得など

座標位置から画面上のピクセル位置を取得,ピクセル位置からグラフ上の座標位置を取得など  (TeeChart Pro 8.06)

uessに TeEngineを追加

procedure TForm1.GetPosInfo;
var
  i, XPos, YPos: Integer;
  XVal, YVal: Double;
  str1: String;
begin

  //Seriesのデーター点インデックスから点の値とピクセル位置を取得 =====
  i := Series1.FirstValueIndex;//最初の点のインデックス(LastValueIndexは最後の点)
  //データー点の値を取得
  XVal := Series1.XValue[i];
  YVal := Series1.YValue[i];
  //データー点の画面上のピクセル位置を取得
  XPos := Series1.CalcXPos(i);
  YPos := Series1.CalcYPos(i);

  str1 := ‘[Point index ‘ + IntToStr(i) + ‘]’;
  str1 := str1 + #13#10;
  str1 := str1 + ‘Value =(‘ + FloatToStr(XVal) + ‘, ‘ + FloatToStr(YVal) + ‘)’;
  str1 := str1 + #13#10;
  str1 := str1 + ‘Pixel =(‘ + IntToStr(XPos) + ‘, ‘ + IntToStr(YPos) + ‘)’;
  str1 := str1 + #13#10;

  //ウインドウのピクセル位置からグラフ上の座標位置を取得 =====
 
//ピクセル位置100, 100の座標を取得

  XPos := 100;
  YPos := 100;
  XVal := Series1.XScreenToValue(XPos);
  YVal := Series1.YScreenToValue(YPos);

  str1 := str1 + #13#10;
  str1 := str1 + ‘[Pixel (‘ + IntToStr(XPos) + ‘, ‘ + IntToStr(YPos) + ‘)]’;
  str1 := str1 + #13#10;
  str1 := str1 + ‘Value =(‘ + FloatToStr(XVal) + ‘, ‘ + FloatToStr(YVal) + ‘)’;
  str1 := str1 + #13#10;

  //グラフ上の座標位置からウインドウのピクセル位置を取得 =====

  //座標10.0, 5.0のピクセル位置を取得
  XVal := 10.0;
  YVal := 5.0;
  XPos := Series1.CalcXPosValue(XVal);
  YPos := Series1.CalcYPosValue(YVal);

  str1 := str1 + #13#10;
  str1 := str1 + ‘[Value (‘ + FloatToStr(XVal) + ‘, ‘ + FloatToStr(YVal) + ‘]’;
  str1 := str1 + #13#10;
  str1 := str1 + ‘Pixel = (‘ + IntToStr(XPos) + ‘, ‘ + IntToStr(YPos) + ‘)’;
  str1 := str1 + #13#10;

  ShowMessage(str1);

end;