根据 ID 插入变量
Insert Variable based on an ID
我想使用 INSERT 查询插入多行(100 行),基于哪些 ID 不在 Table B 但在 Table A 中。我已经设法做到了,大多数需要插入的信息我都整理好了,除了一个。此值是在 Table A 中找到的值,每个 ID 都不同。
如何根据 ID 相同的地方从 A 到 B 插入正确的对应值?
简化 表格:
TableA TableB
ID |Value ID | Value | Other | Other
-------------- ---------------------------------
1 | ABC 1 | ABC | **** | ****
2 | DFG 2 | DFG | **** | ****
3 | HBO 3 | HBO | **** | ****
我试过使用这个查询:
INSERT INTO TableB
(
ID,
Value,
Other,
Other
)
SELECT
ID,
(SELECT TABLEA.Value FROM TABLEA,TABLEB WHERE TABLEA.ID = TABLEB.ID),
******,
******
FROM TableA
WHERE ID IN
(
SELECT
TABLEA.ID
FROM
TABLEA
MINUS
SELECT
TABLEB.ID
FROM
TABLEB
)
但显然问题在于它比较的是所有 ID,而不是我需要的唯一 ID。是否有任何解决方案可以在插入物内执行此操作?或者我是否需要先插入,将此值留空,然后使用更新查询为其提供正确的值?
编辑:
虽然提到的问题已经解决,但我还有其他一些相关的问题。
以下查询是当前正在进行的查询:
MERGE INTO TableB
USING TableA
ON (TableB.id = TableA.id)
WHEN MATCHED
THEN
UPDATE
SET TableB.VALUE = TableA.VALUE
WHEN NOT MATCHED
THEN
INSERT
(
id,
POSITION,
other,
other,
other,
other,
other,
VALUE
)
VALUES
(
TableA.id,
(
SELECT POSITION
FROM TableC
WHERE something = '<String Value>'
AND VALUE =
(
SELECT VALUE
FROM TableA
WHERE TableA.id = <The Current 'ID'>
) ,
)
*****,
*****,
*****,
*****,
*****,
TableA.VALUE
);
主要问题是,我怎样才能从正确的行中得到 "Value",这样我才能得到正确的 "POSITION"。
我想你想要一个 MERGE
声明。
MERGE INTO TABLEB tgt
USING TABLEA src
ON (tgt.ID = src.ID)
WHEN MATCHED
THEN
UPDATE
SET tgt.value = src.value
WHEN NOT MATCHED
THEN
INSERT (
ID
,VALUE
)
VALUES (
src.id
,src.value
);
试试这个:-
INSERT INTO B
SELECT A.id, A.value
FROM A
FULL OUTER JOIN B ON A.id = B.id WHERE B.id IS NULL
如果我理解正确,您想在 TableB 中插入 TableA 中那些 ID 不在 TableB 中的行。对于 TableB 中存在的 ID,您希望使用 TableA 中的值更新它们的值。对吗?
如果是这样,您要使用 MERGE 语句。答案与前一位用户发布的答案相似,但已更正,这个应该可以正常工作:
MERGE INTO TABLEB tgt
USING TABLEA src
ON (tgt.ID = src.ID)
WHEN MATCHED
THEN
UPDATE
SET tgt.value = src.value
WHEN NOT MATCHED
THEN
INSERT (
ID
,VALUE
)
VALUES (
src.id
,src.value
);
附加问题的答案:
MERGE INTO TableB
USING TableA
ON (TableB.id = TableA.id)
WHEN MATCHED
THEN
UPDATE
SET TableB.VALUE = TableA.VALUE
WHEN NOT MATCHED
THEN
INSERT
(
id,
POSITION,
other,
other,
other,
other,
other,
VALUE
)
VALUES
(
TableA.id,
(
SELECT POSITION
FROM TableC
WHERE something = '<String Value>'
AND VALUE = TableA.VALUE
) as position,
*****,
*****,
*****,
*****,
*****,
TableA.VALUE
);
此外,如果您只想合并 ID 介于 1200 和 1299 之间的表(如我的回答的评论中所述),请尝试编写如下代码:
MERGE INTO (SELECT * FROM TableB WHERE ID BETWEEN 1200 AND 1299) TableB
USING (SELECT * FROM TableA WHERE ID BETWEEN 1200 AND 1299) TableA
ON (TableB.id = TableA.id)
WHEN MATCHED
THEN
UPDATE
SET TableB.VALUE = TableA.VALUE
WHEN NOT MATCHED
THEN
INSERT
(
id,
POSITION,
other,
other,
other,
other,
other,
VALUE
)
VALUES
(
TableA.id,
(
SELECT POSITION
FROM TableC
WHERE something = '<String Value>'
AND VALUE = TableA.VALUE
) as position,
*****,
*****,
*****,
*****,
*****,
TableA.VALUE
);
我想使用 INSERT 查询插入多行(100 行),基于哪些 ID 不在 Table B 但在 Table A 中。我已经设法做到了,大多数需要插入的信息我都整理好了,除了一个。此值是在 Table A 中找到的值,每个 ID 都不同。
如何根据 ID 相同的地方从 A 到 B 插入正确的对应值? 简化 表格:
TableA TableB
ID |Value ID | Value | Other | Other
-------------- ---------------------------------
1 | ABC 1 | ABC | **** | ****
2 | DFG 2 | DFG | **** | ****
3 | HBO 3 | HBO | **** | ****
我试过使用这个查询:
INSERT INTO TableB
(
ID,
Value,
Other,
Other
)
SELECT
ID,
(SELECT TABLEA.Value FROM TABLEA,TABLEB WHERE TABLEA.ID = TABLEB.ID),
******,
******
FROM TableA
WHERE ID IN
(
SELECT
TABLEA.ID
FROM
TABLEA
MINUS
SELECT
TABLEB.ID
FROM
TABLEB
)
但显然问题在于它比较的是所有 ID,而不是我需要的唯一 ID。是否有任何解决方案可以在插入物内执行此操作?或者我是否需要先插入,将此值留空,然后使用更新查询为其提供正确的值?
编辑: 虽然提到的问题已经解决,但我还有其他一些相关的问题。 以下查询是当前正在进行的查询:
MERGE INTO TableB
USING TableA
ON (TableB.id = TableA.id)
WHEN MATCHED
THEN
UPDATE
SET TableB.VALUE = TableA.VALUE
WHEN NOT MATCHED
THEN
INSERT
(
id,
POSITION,
other,
other,
other,
other,
other,
VALUE
)
VALUES
(
TableA.id,
(
SELECT POSITION
FROM TableC
WHERE something = '<String Value>'
AND VALUE =
(
SELECT VALUE
FROM TableA
WHERE TableA.id = <The Current 'ID'>
) ,
)
*****,
*****,
*****,
*****,
*****,
TableA.VALUE
);
主要问题是,我怎样才能从正确的行中得到 "Value",这样我才能得到正确的 "POSITION"。
我想你想要一个 MERGE
声明。
MERGE INTO TABLEB tgt
USING TABLEA src
ON (tgt.ID = src.ID)
WHEN MATCHED
THEN
UPDATE
SET tgt.value = src.value
WHEN NOT MATCHED
THEN
INSERT (
ID
,VALUE
)
VALUES (
src.id
,src.value
);
试试这个:-
INSERT INTO B
SELECT A.id, A.value
FROM A
FULL OUTER JOIN B ON A.id = B.id WHERE B.id IS NULL
如果我理解正确,您想在 TableB 中插入 TableA 中那些 ID 不在 TableB 中的行。对于 TableB 中存在的 ID,您希望使用 TableA 中的值更新它们的值。对吗?
如果是这样,您要使用 MERGE 语句。答案与前一位用户发布的答案相似,但已更正,这个应该可以正常工作:
MERGE INTO TABLEB tgt
USING TABLEA src
ON (tgt.ID = src.ID)
WHEN MATCHED
THEN
UPDATE
SET tgt.value = src.value
WHEN NOT MATCHED
THEN
INSERT (
ID
,VALUE
)
VALUES (
src.id
,src.value
);
附加问题的答案:
MERGE INTO TableB
USING TableA
ON (TableB.id = TableA.id)
WHEN MATCHED
THEN
UPDATE
SET TableB.VALUE = TableA.VALUE
WHEN NOT MATCHED
THEN
INSERT
(
id,
POSITION,
other,
other,
other,
other,
other,
VALUE
)
VALUES
(
TableA.id,
(
SELECT POSITION
FROM TableC
WHERE something = '<String Value>'
AND VALUE = TableA.VALUE
) as position,
*****,
*****,
*****,
*****,
*****,
TableA.VALUE
);
此外,如果您只想合并 ID 介于 1200 和 1299 之间的表(如我的回答的评论中所述),请尝试编写如下代码:
MERGE INTO (SELECT * FROM TableB WHERE ID BETWEEN 1200 AND 1299) TableB
USING (SELECT * FROM TableA WHERE ID BETWEEN 1200 AND 1299) TableA
ON (TableB.id = TableA.id)
WHEN MATCHED
THEN
UPDATE
SET TableB.VALUE = TableA.VALUE
WHEN NOT MATCHED
THEN
INSERT
(
id,
POSITION,
other,
other,
other,
other,
other,
VALUE
)
VALUES
(
TableA.id,
(
SELECT POSITION
FROM TableC
WHERE something = '<String Value>'
AND VALUE = TableA.VALUE
) as position,
*****,
*****,
*****,
*****,
*****,
TableA.VALUE
);