當查詢有多筆資料時,將資料值賦予給變數,會從最上面的第一筆資料,賦予到最後一筆資料。
系統環境 SQL 2008 R2
首先簡單的設定一張資料,塞入3筆資料。有時間欄位(TH004)格式為 YYYYMMDD
程式碼如下:
CREATE TABLE [dbo].[TB001](
[TH001] [varchar](4) NOT NULL,
[TH002] [varchar](11) NOT NULL,
[TH003] [nchar](4) NOT NULL,
[TH004] [varchar](10) NULL,
[TH005] [nvarchar](20) NULL,
[TH006] [nvarchar](50) NULL,
[Th007] [int] NULL,
CONSTRAINT [PK_TB001] PRIMARY KEY CLUSTERED
(
[TH001] ASC,
[TH002] ASC,
[TH003] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
INSERT INTO [TB001] VALUES
('PIA','201801018','0002','20180130','3010274-003','AAAAA','6000')
,('PIA','201802009','0001','20180228','3010274-003','AAAAA','3000')
,('PIA','201803018','0001','20180315','3010274-003','AAAAA','4500')
接下來查詢一下資料,按照時間排序
SELECT
TH001,TH002,TH003,TH004,TH005,TH006,TH007
FROM TB001
ORDER BY TH004 DESC
可以看到結果如下:
確實有按照時間欄位(TH004)進行 DESC 排序(大到小)。
我需要查詢的資料值,來做為參數去查詢其他資料表,所以我設定了相關變數資料,讓查詢結果直接賦予給變數。範例如下
DECLARE
@TH001 varchar(4),
@TH002 varchar(11),
@TH003 varchar(4),
@TH004 varchar(10),
@TH005 nvarchar(20),
@TH006 nvarchar(50),
@TH007 int
--依樣依照日期欄位資料進行 DESC 的排序。
SELECT
@TH001 = TH001, @TH002 = TH002, @TH003 = TH003, @TH004 = TH004,
@TH005 = TH005, @TH006 = TH006, @TH007 = TH007
FROM TB001
ORDER BY TH004 DESC
--查詢結果
SELECT
@TH001 AS TH001, @TH002 AS TH002, @TH003 AS TH003, @TH004 AS TH004,
@TH005 AS TH005, @TH006 AS TH006, @TH007 AS TH007
查詢結果如下:
竟然是出現第一筆資料,沒有排序。難怪User會回報資料值是錯誤的。
是不是因為SQL語法的執行順序所造成的結果? (執行順序如下)
FROM --> ON --> JOIN --> WHERE --> GROUP BY --> HAVING --> SELECT --> DISTINCT --> ORDER BY --> TOP
感覺好像是耶??可是哪裡怪怪的,就算排序資料室最後才執行,但是結果也不會是整個顛倒阿??
我們新塞一筆資料到資料庫。這個日期是在中間的資料
INSERT INTO [TB001] VALUES
('PIA','201802003','0002','20180215','3010274-003','AAAAA','2000')
查詢結果如下:
再利用變數的資料進行查詢。(一樣使用上面的語法查詢,結果如下:)
沒有何改變......那我們在新增一筆資料。這次將會是最小的資料。
INSERT INTO [TB001] VALUES
('PIA','201801006','0001','20180108','3010274-003','AAAAA','1000')
讓我們看看結果??
再利用變數的資料進行查詢。(一樣使用上面的語法查詢,結果如下:)
這時候,出現了剛剛新增的最小一筆資料??
原來,因為賦予變數值是用查詢的結果,如果有多筆資料,他會從第一筆資料..塞...到最後一筆。
等到我們下查詢語法檢查變數時,就會查出最後一筆資料內容。所以才會變成前後不同導致錯誤。
要解決,就要在塞值給變數之前,就先把正確的排序給弄好。最好是直接就只查出單一筆資料。(避免耗用資源)
查詢範例如下
DECLARE
@TH001 varchar(4),
@TH002 varchar(11),
@TH003 varchar(4),
@TH004 varchar(10),
@TH005 nvarchar(20),
@TH006 nvarchar(50),
@TH007 int
--先將確定要取出的資料取出,再賦予給變數值
SELECT
@TH001 = TH001, @TH002 = TH002, @TH003 = TH003, @TH004 = TH004,
@TH005 = TH005, @TH006 = TH006, @TH007 = TH007
FROM(
SELECT TOP(1) TH001,TH002,TH003,TH004,TH005,TH006,TH007
FROM TB001
ORDER BY TH004 DESC ) AS A
SELECT
@TH001 AS TH001, @TH002 AS TH002, @TH003 AS TH003, @TH004 AS TH004,
@TH005 AS TH005, @TH006 AS TH006, @TH007 AS TH007
紀錄一下.....然後來去修正之前的錯誤語法了......>"<.......
水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。