我對 SQL 比較陌生,目前正在做一些實際任務來獲得經驗,并且在使用另一個包含join的表中的值更新我的自定義概覽表時遇到了困難。
我有一個包含EmployeeID列的概覽表MyTable。AnotherTable包含具有EmployeeID和ManagerID的員工的資料。
我可以使用不同的連接方法檢索ManagerName,包括:
SELECT m.first_name
FROM AnotherTable.employees e LEFT JOIN
AnotherTable.employees m
on m.EmployeeID = e.ManagerID
但是我在更新MyTable時遇到了困難,因為我通常會收到諸如“單行查詢回傳多行”或“SQL 命令未正確結束”之類的錯誤。我讀過 Oracle 不支持用于更新表的連接。我該如何克服這個問題?樣本資料為:
MyTable
------------------------------
EmployeeID | SomeOtherColumns| ..
1 | SomeData |
2 | SomeData |
3 | SomeData |
4 | SomeData |
5 | SomeData |
------------------------------
OtherTable
-------------------------------------
EmployeeID | Name | ManagerID |
1 | Steve | - |
2 | John | 1 |
3 | Peter | 1 |
4 | Bob | 2 |
5 | Patrick | 3 |
6 | Connor | 1 |
-------------------------------------
結果將是:
MyTable
-------------------------------------------
EmployeeID | SomeOtherColumns |ManagerName|
1 | SomeData | - |
2 | SomeData | Steve |
3 | SomeData | Steve |
4 | SomeData | John |
5 | SomeData | Peter |
6 | SomeData | Steve |
-------------------------------------------
作為我嘗試使用的選項之一是:
update MyTable
set MyTable.ManagerName = (
SELECT
(m.name) ManagerName
FROM
OtherTable.employees e
LEFT JOIN OtherTable.employees m ON
m.EmployeeID = e.ManagerID
)
但是我得到“單行查詢回傳多行”錯誤。怎么可能解決這個問題?
uj5u.com熱心網友回復:
您可以使用分層查詢:
UPDATE mytable m
SET managername = (SELECT name
FROM othertable
WHERE LEVEL = 2
START WITH employeeid = m.employeeid
CONNECT BY PRIOR managerid = employeeid);
或自加入:
UPDATE mytable m
SET managername = (SELECT om.name
FROM othertable o
INNER JOIN othertable om
ON (o.managerid = om.employeeid)
WHERE o.employeeid = m.employeeid);
其中,對于樣本資料:
CREATE TABLE MyTable (EmployeeID, SomeOtherColumns, ManagerName) AS
SELECT LEVEL, 'SomeData', CAST(NULL AS VARCHAR2(20))
FROM DUAL
CONNECT BY LEVEL <= 5;
CREATE TABLE OtherTable(EmployeeID, Name, ManagerID) AS
SELECT 1, 'Alice', NULL FROM DUAL UNION ALL
SELECT 2, 'Beryl', 1 FROM DUAL UNION ALL
SELECT 3, 'Carol', 1 FROM DUAL UNION ALL
SELECT 4, 'Debra', 2 FROM DUAL UNION ALL
SELECT 5, 'Emily', 3 FROM DUAL UNION ALL
SELECT 6, 'Fiona', 1 FROM DUAL;
然后在任一更新后,MyTable包含:
員工ID 其他列 經理姓名 1 一些資料 空值 2 一些資料 愛麗絲 3 一些資料 愛麗絲 4 一些資料 綠柱石 5 一些資料 頌歌
注意:保留此資料違反第三范式;相反,您應該將員工姓名與其他員工資料一起保存在表中,然后當您想要顯示經理姓名時,請使用SELECT ... FROM ... LEFT OUTER JOIN分層查詢來包含結果。您不想做的是復制資料,因為當某些事情發生變化時,它有可能變得不同步。
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/425310.html
