我有一组SQL查询,每个查询都是一个插入语句,可以从其他表中获取其值:
insert into table1 values (
(select tableID from Table1 where Name = 'Name1'),
(select tableID from Table2 where Name = 'Name2'),
(select tableID from Table3 where Name = 'Name3')
)
如果select语句无法在表中找到值(即,如果表1中没有' Name1'),那么该字段将变为NULL。
除了将表设计更改为不允许NULL之外,如果嵌套的select语句无法找到指定的值,是否有一种方法可以将我的SQL修改为失败而不是插入NULL? / p>
答案 0 :(得分:2)
我要做的是最初将值存储在变量中:
DECLARE @tableID1 INT = (SELECT tableID FROM Table1 WHERE Name = 'Name1')
然后你可以做一个
IF @tableID1 IS NOT NULL AND @tableID2 IS NOT NULL...
INSERT...
或者INSERT INTO table1 SELECT @tableID1 WHERE @tableID1 IS NOT NULL
。
如果由于某种原因你想在一个混乱的声明中做到这一点,你可以这样做:
INSERT INTO table1
(select tableID from Table1 where Name = 'Name1'),
(select tableID from Table2 where Name = 'Name2'),
(select tableID from Table3 where Name = 'Name3')
WHERE EXISTS (select 1 from Table1 where Name = 'Name1'),
AND EXISTS (select 1 from Table2 where Name = 'Name2'),
AND EXISTS (select 1 from Table3 where Name = 'Name3')
答案 1 :(得分:0)
有点啰嗦,但这项工作应该很快。
IF OBJECT_ID('tempdb..##table1') IS NOT NULL
DROP TABLE ##table1
insert into ##table1 values (
(select tableID from Table1 where Name = 'Name1'),
(select tableID from Table2 where Name = 'Name2'),
(select tableID from Table3 where Name = 'Name3')
)
insert into table1
SELECT * FROM ##table1
where tableID is not null
你也可以插入它然后,
DELETE FROM table1 where tableID is null
答案 2 :(得分:0)
使用更新声明
尝试做
Update Table table_name set id = (select if(Name = NULL, NULL, tableID) from Table1 where Name = 'Name1')
答案 3 :(得分:0)
请尝试使用内置的sql函数来检查内部查询是否返回null。例如
insert into table1 values (
IFNULL((select tableID from Table1 where Name = 'Name1'),""),
IFNULL((select tableID from Table2 where Name = 'Name2'),"")
)
答案 4 :(得分:0)
您正在寻找的构造是insert . . . select
。这允许您在查询上放置where
子句。因为您的子查询必须返回一行,所以您可以执行cross join
,它最多会返回一行:
insert into table1(id1, id2, id3)
select t1.tableID, t2.tableId, t3.tableId
from (select tableID from Table1 where Name = 'Name1') t1 cross join
(select tableID from Table2 where Name = 'Name2') t2 cross join
(select tableID from Table3 where Name = 'Name3') t3
where t1.tableID is not null and t2.tableId is not null and t3.tableId is not null;
我的猜测是where
子句是不必要的。在您的情况下,NULL
可能不是表id的值,但表示没有找到行。 <* 1}}在没有行的表上没有返回任何行,因此不会插入任何行。