簡體   English   中英

如何將一個表中的多行插入到另一個表的單行的結構列中?

[英]How do I insert multiple rows from one table into a struct column of a single row of another table?

我現在有 2 個源表。

表 #1:sourceTableMain

|EmployeeNumber| DepartmentNumber | CostCenterNumber |
| -------------| ---------------- |------------------|
| 1            | 100              |  1001            |
| 2            | 200              |  1001            |
| 3            | 100              |  1002            |

表 #2:sourceTableEmployee

|EmployeeNumber| EmployeeFirstName | EmployeeLastName | EmployeeAddress |
| -------------| ----------------  |------------------|---------------- |
| 1            | Michael           | Scott            | 110 ABC Ln      |
| 1            | Michael           | Scott            | 450 XYZ Ln      |
| 2            | Dwight            | Schrute          | 321 PQR St      |
| 3            | Jim               | Halpert          | 678 LMN Blvd    |

我正在嘗試將合並的行插入到名為targetTableCombined的第三個表中,該表具有以下架構:

字段名 類型 模式
員工編號 INTEGER 可空
員工詳情 (結構) 記錄 重復
員工名字 細繩 可空
員工姓氏 細繩 可空
員工地址 細繩 可空

在目標表 (targetTableCombined) 中,我試圖確保對於每個 employeeNumber,所有名字、姓氏和地址都在單個結構數組下重復。 例如,EmployeeNumber 1 在目標表中應該只有 1 行,名字、姓氏和不同的地址作為第二列(結構)的一部分,每個都在單獨的行中。

我寫了一個插入腳本來做到這一點,但我錯了:

        insert into `dev.try_sbx.targetTableCombined`
    
        select 
            main.employeeNumber,
                array(
                    select as struct
                        emp.employeeFirstName,
                        emp.employeeLastName,
                        emp.employeeAddress
                )
        from
          `dev.try_sbx.sourceTableMain` as main
              inner join `dev.try_sbx.sourceTableEmployee` as emp
                  on main.EmployeeNumber = emp.EmployeeNumber;

這是我在運行上面的查詢時得到的結果:

| EmployeeNumber | EmployeeDetails                |
| -------------  | ------------------------------ |
| 1              | [Michael, Scott, 110 ABC Ln]   |
| 1              | [Michael, Scott, 450 XYZ Ln]   |
| 2              | [Dwight,  Schrute, 321 PQR St] |
| 3              | [Jim, Halpert, 678 LMN Blvd]   |

(很抱歉無法共享屏幕截圖 - 我沒有足夠的代表。但要詳細說明,我希望插入只有 3 行(員工 1 應該有一個包含兩個地址的數組)。相反,我正在獲取插入后 4 行。)

我的腳本哪里出錯了?

這是因為ARRAY()不是聚合 function。您應該將ARRAY_AGG()GROUP BY一起將每個員工的詳細信息分組到一個數組中。

SELECT EmployeeNumber,
       ARRAY_AGG((SELECT AS STRUCT EmployeeFirstName, EmployeeLastName, EmployeeAddress)) AS employeeDetails
   FROM `dev.try_sbx.sourceTableEmployee`
  GROUP BY 1;

更優選的方式是:

SELECT EmployeeNumber,
       ARRAY_AGG(STRUCT(EmployeeFirstName, EmployeeLastName, EmployeeAddress)) AS employeeDetails
   FROM `dev.try_sbx.sourceTableEmployee`
  GROUP BY 1;

output:

在此處輸入圖像描述

暫無
暫無

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

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