2020年7月13日 星期一

Oracle TABLE 移動 tablespace

變更連線
ALTER SESSION SET CURRENT_SCHEMA =Owner;
移動資料表,資料移動期間整個 table  lock 
ALTER TABLE   OBJECT_NAME   MOVE TABLESPACE  NEW;
重建Index
ALTER INDEX  INDEX_NAME REBUILD TABLESPACE NEWNDX ;



T-SQL Select 設定null 欄位型態

SELECT   CAST(NULL as VARCHAR2(100)) as  varcchar2,CAST(NULL as date) as  datetime FROM dual;

2014年6月16日 星期一

MS-SQL 欄位值 大小寫識別 T-SQL

最近發現 MS-SQL 字串欄位,大寫 和 小寫 會視為相同的值,資料比對誤判
只要在欄位名稱後 加上 Collate SQL_Latin1_General_CP1_CS_AS 大小就視為不同,
相反 SQL_Latin1_General_CP1_CI_AS 就視為相同

如下案例:
select
case when  'ABC' = 'abc'   then 'Yes' else 'NO' End  NO_CS_AS ,
case when  'ABC' Collate SQL_Latin1_General_CP1_CS_AS
         = 'abc' then 'Yes' else 'NO' End   CS_AS,
case when  'ABC' Collate SQL_Latin1_General_CP1_CI_AS
         = 'abc' then 'Yes' else 'NO' End   CI_AS

select
case when 'Abc'  = 'ABC'   then '字串模糊比對' else 'Abc <> ABC' end AS "資料庫預設",
case when 'Abc' Collate SQL_Latin1_General_CP1_CS_AS = 'ABC' Collate SQL_Latin1_General_CP1_CS_AS  then '字串大小寫比對' else 'Abc <> ABC' end AS "指定大小寫比對",
case when 'Abc' Collate SQL_Latin1_General_CP1_CI_AS = 'ABC' Collate SQL_Latin1_General_CP1_CI_AS  then '字串模糊比對' else 'Abc <> ABC' end as "指定模糊比對"

參考 http://technet.microsoft.com/zh-tw/library/ms180175(v=SQL.105).aspx

2014年2月21日 星期五

mklink 建立資料匣連結

mklink/?
建立符號連結。

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      建立目錄符號連結。預設是檔案符號連結。
        /H      建立永久連結而不是符號連結。
        /J      建立目錄連接。
        Link    指定新符號連結名稱。
        Target  指定新連結參照的路徑 (相對或絕對)。

2013年1月11日 星期五

MS SQL 使用Rowid 更新資料方法


--Form: http://www.databasejournal.com/features/mssql/article.php/3572301/RowNumber-function-in-SQL-Server-2005.htm

Jan 4, 2006

Row_Number() function in SQL Server 2005

As we all know, SQL Server 2005 has new features when compared to SQL Server 2000. One of the features that we are going to discuss in this article is the Row_Number() function. SQL Server Database administrators and developers have been longing for this function for a long time--now the wait is over.
Traditionally developers and Database administrators used temporary tables and co-related sub-queries to generate calculated row numbers in a query. Now SQL Server 2005 provides a function, which replaces all of the additional resources we used to generate row numbers.
Let us assume that we have the following database [EMPLOYEE TEST] and the following table [EMPLOYEE] in the database. You can use the below query to create the database, table and all the corresponding rows.
USE [MASTER]
GO
IF  EXISTS 
  (SELECT NAME FROM SYS.DATABASES WHERE NAME = N'EMPLOYEE TEST')
DROP DATABASE [EMPLOYEE TEST]
GO
CREATE DATABASE [EMPLOYEE TEST]
GO
USE [EMPLOYEE TEST]
GO
IF  EXISTS 
  (SELECT * FROM SYS.OBJECTS 
  WHERE OBJECT_ID = 
    OBJECT_ID(N'[DBO].[EMPLOYEE]') AND TYPE IN (N'U'))
DROP TABLE [DBO].[EMPLOYEE]
GO
CREATE TABLE EMPLOYEE (EMPID INT, FNAME VARCHAR(50),
LNAME VARCHAR(50))
GO
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) 
VALUES (2021110, 'MICHAEL', 'POLAND')
GO
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) 
VALUES (2021110, 'MICHAEL', 'POLAND')
GO
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) 
VALUES (2021115, 'JIM', 'KENNEDY')
GO
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) 
VALUES (2121000, 'JAMES', 'SMITH')
GO
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) 
VALUES (2011111, 'ADAM', 'ACKERMAN')
GO
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) 
VALUES (3015670, 'MARTHA', 'LEDERER')
GO
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) 
VALUES (1021710, 'MARIAH', 'MANDEZ')
GO
Let us browse the table Employee by using the following SQL Query.
SELECT EMPID, FNAME, LNAME FROM EMPLOYEE
The results of the above query look like illustration 1.0.
2021110MICHAELPOLAND
2021110MICHAELPOLAND
2021115JIMKENNEDY
2121000JAMESSMITH
2011111ADAMACKERMAN
3015670MARTHALEDERER
1021710MARIAHMANDEZ

Illustration 1.0
Traditionally in SQL Server 2000, in order to create row numbers based on the rows available in a table, we used to use the following query.
SELECT ROWID=IDENTITY(int,1,1) , EMPID, FNAME, LNAME 
INTO EMPLOYEE2 FROM EMPLOYEE ORDER BY EMPID
This query created a new table using the identity function in order to generate RowId.
Let us query the table by using the following query.
SELECT RowID, EMPID, FNAME, LNAME FROM EMPLOYEE2
The results of the above query would look like illustration 1.1.
11021710MARIAHMANDEZ
22011111ADAMACKERMAN
32021110MICHAELPOLAND
42021110MICHAELPOLAND
52021115JIMKENNEDY
62121000JAMESSMITH
73015670MARTHALEDERER

Illustration 1.1
In this illustration it is clear that the table has a duplicate row with EMPID = 2021110.
To delete the duplicate row with EMPID = 2021110, we have to delete the row in employee2 table and I cannot delete the duplicate row directly from the Employee table.
SQL Server 2005 provides a new function, Row_Number(), for generating row numbers. In order to delete the duplicate row from the original table we can use the features, Common Table Expression and Row_Number() together.
Let us generate the ROWID using the Row_Number() function based on EMPID.
SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE
The results of the above query would look like illustration 1.2.
11021710MARIAHMANDEZ
22011111ADAMACKERMAN
32021110MICHAELPOLAND
42021110MICHAELPOLAND
52021115JIMKENNEDY
62121000JAMESSMITH
73015670MARTHALEDERER

Illustration 1.2
In this result set, we can identify the duplicate row for the EMPID 2021110.
Let us display the duplicate row using the Common Table expression and Row_Number() function by using the following query.
WITH [EMPLOYEE ORDERED BY ROWID] AS
(SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE)
SELECT * FROM [EMPLOYEE ORDERED BY ROWID] WHERE ROWID =4
The results of the above query would look like illustration 1.3.
42021110MICHAELPOLAND

Illustration 1.3
This duplicate row can be deleted using the Common Table expression and Row_Number() function by using the following query.
WITH [EMPLOYEE ORDERED BY ROWID] AS
(SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE)
DELETE FROM [EMPLOYEE ORDERED BY ROWID] WHERE ROWID =4
Let us query the table using the following query.
SELECT * FROM EMPLOYEE
The results of the above query would look like illustration 1.4.
2021110MICHAELPOLAND
2021115JIMKENNEDY
2121000JAMESSMITH
2011111ADAMACKERMAN
3015670MARTHALEDERER
1021710MARIAHMANDEZ

Illustration 1.4
In this illustration, we can see that the duplicate row has been deleted.

Conclusion

In this article, we have discussed the new features of Row_Number() function and Common Table Expression and used both the features together to delete duplicate rows.
» See All Articles by Columnist MAK

2012年4月6日 星期五

what is difference between wmsys.wm_concat and ListAgg

This thread is to discussion what is difference between wmsys.wm_concat and ListAgg for 11G r2

*************************************************************************
difference1 :-)

wmsys.wm_concat allows distinct option.
ListAgg does not allows it.
create table diffT(sortKey,Val) as
select 1,'aa' from dual union all
select 2,'bb' from dual union all
select 3,'aa' from dual union all
select 4,'dd' from dual;
 
col concatV for a20
 
select wmsys.wm_concat(distinct Val) as concatV from diffT;
 
concatV 
--------
aa,bb,dd


*************************************************************************
difference2 :-)

ListAgg allows to decide string concat order.
wmsys.wm_concat does not allows it.

select ListAgg(Val,',')
       within group(order by sortKey desc) as concatV
from diffT;
 
CONCATV
------------
dd,aa,bb,aa 


*************************************************************************
difference3 :-)

ListAgg allows to decide delimiter.
wmsys.wm_concat does not allows it.

select ListAgg(Val,'***')
       within group(order by sortKey desc) as concatV
from diffT;
 
CONCATV
-----------------
dd***aa***bb***aa


*************************************************************************
difference4 :-)

wmsys.wm_concat allows to be used OLAP function with order by
ListAgg does not allows it.
ListAgg allows only OLAP function without order by.

select sortKey,wmsys.wm_concat(Val)
               over(order by sortKey) as concatV
  from diffT;
 
SORTKEY  CONCATV
-------  -----------
      1  aa
      2  aa,bb
      3  aa,bb,aa
      4  aa,bb,aa,dd


*************************************************************************
difference5 :-)

wmsys.wm_concat allows to be used KEEP
ListAgg does not allows it.

select wmsys.wm_concat(Val) 
       Keep(Dense_Rank First order by Val) as concatV 
  from diffT;
 
CONCATV
-------
aa,aa

wmsys.wm_concat 將資料列轉行

SELECT   code, wmsys.wm_concat (col1) combine
          FROM table
      GROUP BY  code