none
有人看得懂下面的SQL語法嗎?我真的看不懂?拜托幫我解譯一下好嗎? RRS feed

  • 問題

  •  

    請教一下各位先進 Sad我是用ACESS 去寫的)

    我在 MSSQL 中,有一個 Table 有設 Primary Key (唯一),資料欄位內有一時間欄位,我希望透過一些條件 SELECT 出所需的資料,但需要排除某個宣告為 Char(21) 的欄位重複的值,在這些重覆的值中挑選出時間最新的資料...

    Ex :

    PK F1 KF TF
    ----------------------------------------
    1 A1 K1 2004/4/13 18:00
    2 A1 K1 2004/4/14 18:00
    3 A2 K1 2004/4/19 18:00
    4 A2 K1 2004/4/13 18:00
    5 A3 K1 2004/4/13 18:00
    6 A3 K1 2004/4/17 18:00
    7 A4 K1 2004/4/17 18:00
    8 A4 K1 2004/4/13 18:00
    9 A5 K2 2004/4/13 18:00
    10 A5 K2 2004/4/14 18:00

    條件篩選類似 WHERE KF='K1' , 刪除重複值後取出最新的資料..
    結果會類似以下
    PK F1 KF TF
    ----------------------------------------
    2 A1 K1 2004/4/14 18:00
    3 A2 K1 2004/4/19 18:00
    6 A3 K1 2004/4/17 18:00
    7 A4 K1 2004/4/17 18:00

    如果先取資料後再利用 Delphi 運算,這我已經有解法了,但是我想知道是否有直接利用 SQL Command 的方式可以解決這個問題..

    我有試過 Group By,但是 Group By 若是要取得全部資料,要在 Group By 後加入欲取的欄位串列,但加入 PK 值後結果便不同...

    利用 DISTINCT 也是類似這樣的結果....

    接著我上網查資料,發現解決的方法,就是用

    SELECT * FROM [TableName] A
    WHERE A.KF='K1' AND A.TF=(SELECT MAX(TF) FROM [TableName] B WHERE B.F1=A.F1 AND B.KF=A.KF)

    可以解決。

    但是看了很久,還是不太瞭解為何可以這樣寫。

    (1) 為什麼第一個表,使用A,來當別名後,可以拉到後面的子查詢裡,使得A.F1 AND B.KF=A.KF 

    (2) 再來就是當 
    SELECT MAX(TF) FROM [TableName] B WHERE B.F1=A.F1 AND B.KF=A.KF)

     完後,select出來的值是什麼,是每個A1,A2,A3,A 4,A5的最新日期嗎? 如果是的話?為何可以這樣做?這樣

    SELECT * FROM [TableName] A
    WHERE A.KF='K1' AND A.TF=(

    不是無法對出唯一值了嗎?為何沒有產生錯誤?

    (3)總之請各位大大,能解答的地方,請盡量解答,因為我是新手,真的不太瞭解,還需要各位大大的請教,謝謝。

    (4)有教學這種比較進階的SQL網站嗎?可以跟我講嗎?謝謝!
    • 2008-08-27 00:14:24 補充

      參考資料:http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=51982

    2008年8月26日 下午 04:25

解答

  • 不要對 Access 的 SQL 期望太高,雖然可以做到 SQL 的基本要求,但還是無法做到比較進階的能力。

     

    Microsoft Jet SQL reference:

    http://office.microsoft.com/zh-tw/access/CH062526881028.aspx

     

    SQL 語法教學:

    http://www.1keydata.com/tw/sql/sql.html

     

    (1)

    那是子查詢內連結的概念,在同一個查詢本體 (query context) 中,主查詢中的表格可以和子查詢中的表格連接,例如下列的 SQL:

     

    Code Snippet

    SELECT s2.Code, s.TxDate

    FROM SaleTxRecords s INNER JOIN Shop s2 ON s.ShopID = s2.ShopID
    WHERE s.TxDate =

        (SELECT MAX(TxDate) FROM SaleTxRecords s3 WHERE s.ShopID = s3.ShopID)
    ORDER BY s2.Code

     

     

    可以視為與下列的 SQL 相同:

     

    Code Snippet

    SELECT s2.Code, s.TxDate
    FROM SaleTxRecords s

       INNER JOIN Shop s2 ON s.ShopID = s2.ShopID 
       INNER JOIN

         (SELECT ShopID, MAX(TxDate) AS TxDate FROM SaleTxRecords GROUP BY ShopID)

         s3 ON s.ShopID = s3.ShopID
    WHERE s.TxDate = s3.TxDate
    ORDER BY s2.Code

     

     

    (2) 原理同 (1)。

    2008年8月27日 上午 02:19
    版主

所有回覆

  • 你看過線上手冊關於子查詢的說明嗎?

    2008年8月26日 下午 04:42
  •  

    可以請大大你跟我說一下 ,關於大大說的功能說明在那裡嗎?因為我找了ACESS的許多說明,還是查不到在那裡?可以跟我講一下,讓我知道一下好嗎?謝謝
    2008年8月27日 上午 12:11
  • 不要對 Access 的 SQL 期望太高,雖然可以做到 SQL 的基本要求,但還是無法做到比較進階的能力。

     

    Microsoft Jet SQL reference:

    http://office.microsoft.com/zh-tw/access/CH062526881028.aspx

     

    SQL 語法教學:

    http://www.1keydata.com/tw/sql/sql.html

     

    (1)

    那是子查詢內連結的概念,在同一個查詢本體 (query context) 中,主查詢中的表格可以和子查詢中的表格連接,例如下列的 SQL:

     

    Code Snippet

    SELECT s2.Code, s.TxDate

    FROM SaleTxRecords s INNER JOIN Shop s2 ON s.ShopID = s2.ShopID
    WHERE s.TxDate =

        (SELECT MAX(TxDate) FROM SaleTxRecords s3 WHERE s.ShopID = s3.ShopID)
    ORDER BY s2.Code

     

     

    可以視為與下列的 SQL 相同:

     

    Code Snippet

    SELECT s2.Code, s.TxDate
    FROM SaleTxRecords s

       INNER JOIN Shop s2 ON s.ShopID = s2.ShopID 
       INNER JOIN

         (SELECT ShopID, MAX(TxDate) AS TxDate FROM SaleTxRecords GROUP BY ShopID)

         s3 ON s.ShopID = s3.ShopID
    WHERE s.TxDate = s3.TxDate
    ORDER BY s2.Code

     

     

    (2) 原理同 (1)。

    2008年8月27日 上午 02:19
    版主
  • 這裡是 SQL Server 版,你若是純 Access 的問題,應該貼到 ADO.NET 或 Office Developer 去,原先以為你是 Access 連 SQL Server ,那就是看 SQL Server 線上手冊關於 T-SQL 的說明。

     

    Access 在 2003 以前都有附中文的線上說明,2007 以後沒有,要從 2003 拷貝,檔名為:

    JETSQL40.CHM

     

    是 SQL 與法的說明。

    2008年8月27日 上午 03:22