SET @count := (SELECT count(*)
FROM dbo.ManyToManyTable SRSG
JOIN tableA SG on SRSG.a = SG.a
JOIN tableB SR on SRSG.b = SR.a
WHERE SR.c = INPUT_VALUE);
IF (@count > 0)
THEN
SELECT SG.fieldA, SG.fieldB
FROM dbo.ManyToManyTable SRSG
JOIN tableA SG on SRSG.a = SG.a
JOIN tableB SR on SRSG.b = SR.a
WHERE SR.c = INPUT_VALUE;
ELSE
SELECT SG.a, SG.b FROM dbo.tableA SG WHERE SG.b = "default value";
END IF;
这是一个MySQL数据库。这适用于我,但我不喜欢重复的选择查询。然而,我不知道如何在约束下修复它,这是逻辑在一个存储过程中。
您可以将其编写为单个查询:
with cte as (
SELECT SG.fieldA, SG.fieldB
FROM dbo.ManyToManyTable SRSG JOIN
tableA SG
on SRSG.salesGroupId = SG.salesGroupId JOIN
tableB SR
on SRSG.salesRegionId = SR.salesRegionId
WHERE SR.AField = INPUT_VALUE
)
select *
from cte
union all
select SG.a, SG.b
from dbo.tableA SG
where SG.b = 'default value' and
not exists (select 1 from cte);
MySQL倾向于实现cte(总是?),所以这应该运行一次查询而不是两次。
一个快速但部分加速的方法是替换
SET @count = ( SELECT COUNT(*) ... );
IF (@count > 0)
with this(使用初始SELECT的剩余部分):
IF ( EXISTS ( SELECT 1 FROM ... ) )
同样为了性能考虑,一定要在SRSG:
中PRIMARY KEY(a,b)
INDEX(b,a)
,不要使用AUTO_INCREMENT。