簡體   English   中英

使用 SQL Server 中的 CTAS 將數據從具有不同列名的源映射到現有 SQL 表

[英]Map data with CTAS in SQL Server from source with different column names to existing SQL table

設想:

是源表SourceData (Name, Number, Date)

是否存在表ProdData (ProdName、ProdNumber、CreatedDate)

要求:

如果生產數據中已經存在,請不要從源導入!!!

將行從源導入到生產數據,保留現有行,附加新行,映射列,如:

  • 名稱 -> 產品名稱
  • 編號 -> 產品編號
  • 日期 -> CreatedDate ( IF Date NULL add SystemDate time )

輸出數據示例:

源數據

Name | Number | Date
-----+--------+------ 
A    | 1      | 2012
B    | 2      | NULL

生產數據

ProdName | ProdNumber | CreatedDate
---------+------------+------------
Existing |    123     | 2018
A        |    1       | 2012    
B        |    2       | 2020

這樣的東西會滿足您的需求嗎?

INSERT ProdData (ProdName, ProdNumber, CreatedDate)
SELECT 
    SourceData.name as "ProdName",
    SourceData.Number as "ProdNumber",
    NVL(SourceData.Date,to_date(sysdate,'YYYY') as "CreatedDate"
FROM 
    SourceData
WHERE 
    NOT EXISTS (SELECT
                    1 
                FROM 
                    ProdData PD2 
                WHERE 
                    PD2.ProdName = SourceData.name
                    and PD2.ProdNumber = SourceData.Number
                    and NVL(PD2.CreatedDate,to_date(sysdate,'YYYY') = nvl(SourceData.Date,to_date(sysdate,'YYYY');

另一個替代選項可能類似於:

CREATE TABLE ProdData_new
WITH
    (
      DISTRIBUTION = HASH(ProdName)
    , CLUSTERED INDEX (ProdNumber)
    )
AS
SELECT 
      pdold.ProdName AS ProdName
    , pdold.ProdNumber AS ProdNumber
    , NVL(pdold.CreatedDate,to_date(sysdate,'YYYY')) AS CreatedDate
FROM      
    ProdData AS pdold

UNION 

SELECT 
      sdold.name AS ProdName
    , sdold.Number AS ProdNumber
    , NVL(sdold.Date,to_date(sysdate,'YYYY') AS CreatedDate
FROM 
    SourceData AS sdold
;

--Optional Renaming of old tables
--RENAME OBJECT ProdData TO ProdData_old;
--RENAME OBJECT SourceData TO SourceData_old;
--RENAME OBJECT ProdData_new TO ProdData;
--DROP TABLE ProdData_old;
--DROP TABLE SourceData_old;

或者可能更像:

CREATE TABLE ProdData_new
    ( ProdName NVARCHAR NOT NULL 
    , ProdNumber INT NOT NULL
    , CreatedDate INT NOT NULL)
WITH
    ( DISTRIBUTION = HASH(ProdName)
    , CLUSTERED INDEX (ProdNumber) )
AS
SELECT 
      pdold.ProdName AS ProdName
    , pdold.ProdNumber AS ProdNumber
    , NVL(pdold.CreatedDate,to_date(sysdate,'YYYY')) AS CreatedDate
FROM      
    ProdData AS pdold

UNION 

SELECT 
      sdold.name AS ProdName
    , sdold.Number AS ProdNumber
    , NVL(sdold.Date,to_date(sysdate,'YYYY') AS CreatedDate
FROM 
    SourceData AS sdold
;

--Optional Renaming of old tables
--RENAME OBJECT ProdData TO ProdData_old;
--RENAME OBJECT SourceData TO SourceData_old;
--RENAME OBJECT ProdData_new TO ProdData;
--DROP TABLE ProdData_old;
--DROP TABLE SourceData_old;

在不知道您嘗試過什么、您的特定語法和您的 DB_Schema_Table 設置的情況下,這都是一些猜測工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM