| MSDE FunClub |
|
最終更新日 : 2000/07/08 |
|
Microsoft Data Engine FunClub
|
Since 2000.07.08
|
|
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻) |
|
【第2章120p 〜 123p掲載】 |
-- [SQL文の基礎(例題21番)EX-21.SQL]
-- SQLServer7.0 Transact-SQL言語
-- 日本技術ソフト開発 堀川 明
-- http://www.horikawa.ne.jp/msde/
--
-- これから操作する既定のデータベースを MySampleTest にします
USE MySampleTest
GO
-- ( 件処理されました)の表示を抑制する
SET NOCOUNT ON
GO
-- [受注]テーブルの存在チェック
IF( ( object_id('受注') IS NULL ) OR
OBJECTPROPERTY( object_id('受注') , 'IsTable' ) = 0 )
BEGIN
PRINT '****Error!!****'
PRINT 'AccessのNorthwindデータベースの[受注]テーブルを使います'
PRINT '[受注]テーブルを転送してください'
RAISERROR( '[受注]テーブルが見つかりません',16,127)
RETURN
END
GO
-- *****************
-- 考え方−1番目
-- *****************
-- SQL文を個別に発行して考える方法です
-- 作業用変数は、バッチ内で有効です
DECLARE @Max money -- 最大の受注金額
DECLARE @Cd int -- 最大金額を受注した受注コード
DECLARE @Ps int -- 社員番号(社員番号は、テーブル設計上 int になっている)
PRINT '【考え方−1番目】'
-- 手順1:最大の受注金額を取得します
SELECT @Max = (SELECT MAX(単価*数量*(100-割引)/100) FROM 受注明細)
PRINT '最大受注金額 = ' + STR(@Max)
-- 手順2:最大の受注金額に対応する受注コードを求める
-- この受注コードは複数個存在するため、作業用変数1個に代入することはできない
-- そのためカーソル処理を使うことになる
DECLARE CODE_Cur CURSOR FOR
SELECT 受注コード FROM 受注明細
WHERE ( 単価*数量*(100-割引)/100 ) = @Max
-- カーソルを開く
OPEN CODE_Cur
-- カーソル先頭行を取得し、その受注コードの値を@Cdに代入する
FETCH NEXT FROM CODE_Cur INTO @Cd
-- @@FETCH_STATUS = 0 の間、カーソルにはレコードがあります
WHILE @@FETCH_STATUS = 0
BEGIN
-- 最大の販売金額に対応する受注コードの表示
PRINT 'その時の受注コード= ' + STR(@Cd)
-- 手順3:受注コードに対応する社員コードを検索する
SELECT @Ps = (SELECT 社員コード FROM 受注 WHERE 受注コード = @Cd)
-- 手順4:社員情報を表示する
SELECT 社員コード,氏名 FROM 社員 WHERE (社員コード = @Ps)
-- 次の値を取得する
FETCH NEXT FROM CODE_Cur INTO @Cd
END
-- カーソルを閉じる
CLOSE CODE_Cur
-- 指定カーソルの資源全体の破棄
-- DECLARE宣言で得られたカーソル情報資源を解放するため
-- 再びOPENすることはできない
DEALLOCATE CODE_Cur
GO
-- *****************
-- 考え方−2番目
-- *****************
-- SQL文を2回の発行で済ませる方法です
-- 最大金額を求めた後に、表の結合で取得する
DECLARE @Max money -- 最大の受注金額
PRINT '【考え方−2番目】'
-- 手順1:最大の受注金額を取得します
SELECT @Max = (SELECT MAX(単価*数量*(100-割引)/100) FROM 受注明細)
-- 手順2:3個の表を等結合させます
SELECT 受注.社員コード,社員.氏名
FROM ( 受注明細 INNER JOIN 受注 ON 受注明細.受注コード = 受注.受注コード)
INNER JOIN 社員 ON 受注.社員コード = 社員.社員コード
WHERE ((100-受注明細.割引)/100*受注明細.単価*受注明細.数量)=@Max
GO
-- *****************
-- 考え方−3番目
-- *****************
-- 1回のSQL文で求める
PRINT '【考え方−3番目】'
SELECT 受注.社員コード,社員.氏名
FROM ( 受注明細 INNER JOIN 受注 ON 受注明細.受注コード = 受注.受注コード)
INNER JOIN 社員 ON 受注.社員コード = 社員.社員コード
WHERE (
((100-受注明細.割引)/100*受注明細.単価*受注明細.数量) =
(SELECT MAX(単価*数量*(100-割引)/100) FROM 受注明細)
)
GO
-- *****************
-- 考え方−4番目
-- *****************
-- IN述語をうまく使用した1回のSQL文で求める
PRINT '【考え方−4番目】'
SELECT 社員.社員コード , 社員.氏名 FROM 社員
WHERE (
社員.社員コード
IN (
SELECT 受注.社員コード FROM 受注
WHERE (
受注.受注コード
IN (
SELECT 受注明細.受注コード FROM 受注明細
WHERE (
((100-受注明細.割引)/100*受注明細.単価*受注明細.数量)
= (SELECT MAX(単価*数量*(100-割引)/100) FROM 受注明細)
)
)
)
)
)
GO