如何防止内部SELECT返回NULL(当匹配没有行时)并强制查询失败。
INSERT INTO tt (t1_id, t2_id) VALUES (
(SELECT id FROM t1 WHERE ...),
(SELECT id FROM t2 WHERE ...)
);
附带问题:是否有更好的方法来形成此查询(t1_id,t2_id是外键,但可能是NULL)?
答案 0 :(得分:6)
如下:
INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id FROM t1, t2 WHERE ...
只需确保SELECT
完全返回您想要的INSERT
- 所以如果t1.id
和t2.id
可能为NULL,那么在您的WHERE
中包含相关条款... AND t1.id IS NOT NULL AND t2.id IS NOT NULL ...
条件(SELECT DISTINCT
)。
如果有可能出现重复的行,您可能还希望使用SELECT t1.id, t2.id FROM some_table AS t1, some_table AS t2
WHERE ...
。
修改:如果您需要来自相同表的不同行的2个ID:
{{1}}
答案 1 :(得分:3)
INSERT INTO tt (t1_id, t2_id) VALUES (
(SELECT id FROM t1 WHERE ...),
(SELECT id FROM t2 WHERE ...)
)
WHERE EXISTS (SELECT id FROM t1 WHERE ...)
AND (SELECT id FROM t2 WHERE ...)
它可能看起来很笨拙和多余,但任何值得盐的SQL执行程序都不会执行每个部分两次。
或者,如果t1和t2以某种方式相关:
INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id
FROM t1
JOIN t2 ON ...
WHERE ...
答案 2 :(得分:0)
可以增强和使用,如下所示
INSERT INTO tt(t1_id,t2_id)
选择不同的t1.id,t2.id
从t1,t2
其中t1.id = t2.id
并且t1.id不为空
并且t2 id不为空
);