Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
插入/更新/删除每一行SQL_Sql_Stored Procedures_Store - Fatal编程技术网

插入/更新/删除每一行SQL

插入/更新/删除每一行SQL,sql,stored-procedures,store,Sql,Stored Procedures,Store,我在表1中有以下数据 SessionID S1 S2 S3 我在另一个表2中有以下数据 EmployeeID | Session 1 | NULL 2 | NULL 3 | NULL 我想做的是更新/插入每一行 范例 预期结果: 表2 任何见解都会有所帮助 谢谢。听起来您希望表2中的每一行与表1中的每一行的每一个组合都有一行。如果是的话 BEGIN TRAN SELECT * INTO #temp FROM TABLE2 DELETE

我在表1中有以下数据

SessionID
S1
S2
S3
我在另一个表2中有以下数据

EmployeeID | Session
1          | NULL
2          | NULL
3          | NULL
我想做的是更新/插入每一行 范例

预期结果: 表2

任何见解都会有所帮助


谢谢。

听起来您希望表2中的每一行与表1中的每一行的每一个组合都有一行。如果是的话

BEGIN TRAN

SELECT * INTO #temp FROM TABLE2

DELETE TABLE2

INSERT TABLE2
(
    EmployeeID,
    Session
)
SELECT
    temp.EmployeeID,
    TABLE1.SessionID
FROM TABLE1 CROSS JOIN #temp temp

DROP #TEMP

COMMIT TRAN

听起来,对于表2中当前的每一行和表1中的每一行的每一个组合,您都希望在表2中有一行。如果是的话

BEGIN TRAN

SELECT * INTO #temp FROM TABLE2

DELETE TABLE2

INSERT TABLE2
(
    EmployeeID,
    Session
)
SELECT
    temp.EmployeeID,
    TABLE1.SessionID
FROM TABLE1 CROSS JOIN #temp temp

DROP #TEMP

COMMIT TRAN

我建议创建一个单独的Employee表。要将数据插入员工会话(表2):


我建议创建一个单独的Employee表。要将数据插入员工会话(表2):


我认为
MERGE
语句有助于:

MERGE INTO TABLE2 t2
    USING (SELECT t2.EmployeeID, t1.SessionID
FROM TABLE2 t2
CROSS JOIN TABLE1 t1) t
        ON t2.EmployeeID = t.EmployeeID AND t2.Session = t.SessionID
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (EmployeeID, Session) VALUES(t.EmployeeID, t.SessionID)
    WHEN NOT MATCHED BY SOURCE THEN
        DELETE
;

我认为
MERGE
语句有助于:

MERGE INTO TABLE2 t2
    USING (SELECT t2.EmployeeID, t1.SessionID
FROM TABLE2 t2
CROSS JOIN TABLE1 t1) t
        ON t2.EmployeeID = t.EmployeeID AND t2.Session = t.SessionID
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (EmployeeID, Session) VALUES(t.EmployeeID, t.SessionID)
    WHEN NOT MATCHED BY SOURCE THEN
        DELETE
;

谢谢,但我认为丹尼尔的答案更适合我的情况谢谢,但我认为丹尼尔的答案更适合我的情况嗨,丹尼尔,你的方法很有效。但我面临着主要的关键问题。在表2中,我的employeeid是主键。因此我尝试将session和employee id作为候选键,但失败了,因为我的表2会话为null。有什么建议吗?如果
EmployeeID
必须是
TABLE2
的主键,那么您就不能做您想做的事情,因为它需要该列中的重复值。如果您可以删除当前密钥并将其替换为覆盖
EmployeeID
Session
的新复合密钥,则只要相同
EmployeeID
没有重复的
Session
值,该密钥就可以工作。每个
EmployeeID
可以有一个空值,但不能超过这个值。嗨,丹尼尔,你的方法很有效。但我面临着主要的关键问题。在表2中,我的employeeid是主键。因此我尝试将session和employee id作为候选键,但失败了,因为我的表2会话为null。有什么建议吗?如果
EmployeeID
必须是
TABLE2
的主键,那么您就不能做您想做的事情,因为它需要该列中的重复值。如果您可以删除当前密钥并将其替换为覆盖
EmployeeID
Session
的新复合密钥,则只要相同
EmployeeID
没有重复的
Session
值,该密钥就可以工作。每个
EmployeeID
可以有一个空值,但最多只能有一个空值。
MERGE INTO TABLE2 t2
    USING (SELECT t2.EmployeeID, t1.SessionID
FROM TABLE2 t2
CROSS JOIN TABLE1 t1) t
        ON t2.EmployeeID = t.EmployeeID AND t2.Session = t.SessionID
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (EmployeeID, Session) VALUES(t.EmployeeID, t.SessionID)
    WHEN NOT MATCHED BY SOURCE THEN
        DELETE
;