我想使用INSERT查询插入多个行(100个),基于哪些ID不是在表B中而是在表A中。我已经设法做到了,并且需要插入大多数信息除了一个,我已经整理好了。此值是在表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。在插件内部有解决方案吗?还是我需要先插入,将此值保留为空,然后使用UPDATE查询为它提供正确的值?
编辑: 尽管提到的问题已全部解决,但我还有其他一些相关问题。 以下查询是当前正在进行的工作:
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
);
主要问题是,如何从正确的行中获取“值”,以便能够获取正确的“位置”。
答案 0 :(得分:0)
我认为您想要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
);
答案 1 :(得分:0)
尝试一下:-
INSERT INTO B
SELECT A.id, A.value
FROM A
FULL OUTER JOIN B ON A.id = B.id WHERE B.id IS NULL
答案 2 :(得分:0)
如果我正确理解,您想在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
);
此外,如果您只想为1200和1299之间的ID合并表(如我的答案的注释中所述),请尝试编写如下代码:
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
);