搜尋此網誌

2011-12-04

SQL SERVER 語法筆記

ROW_NUMBER
傳回結果集資料分割內某資料列的序號,序號從 1 開始,每個資料分割第一個資料列的序號是 1。
select top 10 row_number() over (order by CONTACTID) AS Cnt
   , [ContactID]
   , [Title]
   , [FirstName]
   , [LastName]
 from [AdventureWorks].[Person].[Contact]
[SQL]為查詢的結果加上序號(ROW_NUMBER,RANK,OVER)
ROW_NUMBER (Transact-SQL)
RANK (Transact-SQL)

REPLICATE (Transact-SQL)
[SQL]幫某個欄位填入補0並且加字頭的順號語法
LPAD and RPAD functions in SQL

CHARINDEX 與 PATINDEX 的比較
CHARINDEX 與 PATINDEX 函數會傳回您指定的模式的起始位置。PATINDEX 可以使用萬用字元,但 CHARINDEX 不能。

資料類型轉換
如果您希望 Transact-SQL 程式碼符合 ISO,請使用 CAST 來取代 CONVERT。而使用 CONVERT 來代替 CAST,則可利用 CONVERT 的樣式功能。

ORACLE可以在WHERE條件的IN,使用多個欄位,但SQL SERVER不支援此語法 = =|||
--SQL SERVER 無法執行
select * from Table1 a
where (a.f1, a.f2) in
(select b.f1, b.f2 from Table2 b);
--老外的解法
SELECT * FROM table1 a
WHERE EXISTS (
    SELECT * FROM table2 b
    WHERE a.f1 = b.f1 
      AND a.f2 = b.f2 );
--加上Group By
;WITH CTE AS (
 SELECT g.CustomerId, g.Barcode
   FROM Products g
  GROUP BY g.CustomerId, g.Barcode
  HAVING COUNT(1) > 1
)
SELECT *
  FROM Products p
  WHERE EXISTS (
   SELECT * FROM CTE c 
    WHERE c.CustomerId = p.CustomerId
      AND c.Barcode = p.Barcode
  )
  ORDER BY p.Barcode1
參考:
Efficient EXISTS
SQL WHERE.. IN clause multiple columns
“Where IN” with multiple columns (SQL Server)

OUTPUT 子句 (Transact-SQL)

沒有留言: