如何防止内部SELECT返回NULL?

时间:2009-11-29 01:59:56

标签: sql mysql database null

如何防止内部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)?

3 个答案:

答案 0 :(得分:6)

如下:

INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id FROM t1, t2 WHERE ...

只需确保SELECT完全返回您想要的INSERT - 所以如果t1.idt2.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不为空 );