我有两个表(A和B),其中我的查询将表A中的计算与表B中的范围进行比较,然后将相应的值插入第三个表中的范围(也在表B中)(表C)根据日期。但是,表A可能没有每天的数据,而那些日子我想要输入第二个最低范围的值。
TABLE B
id(PK)|date| v1 | v2
TABLE A
Aid|id(FK)|MinRange|MaxRange|Value
TABLE C
Cid|b.date|id(FK)|b.v1|b.v2|A.value
我正在寻找一种在IF EXISTS
子句中嵌入WHERE
的方法:
SELECT B.value
from TableB B
INNER JOIN TableA A ON A.id=B.id
WHERE B.id=4
and (IF DATA EXISTS) B.v1+B.v2 between A.min and A.max (ELSE Choose the second lowest A.min)`
上面的查询是一个例子来解释我想要做的事情,因此,它不是一个有效的查询。我不想使用子查询来解决明显的性能问题。
我会感激任何帮助。谢谢你们提前:)
答案 0 :(得分:1)
这个怎么样?
<强>更新强>
DECLARE myvar INT;
SELECT COUNT(*) INTO myvar FROM TableB WHERE Date=p_date;
SELECT myvar;
IF(myvar>0)
SELECT B.Date,A.Value
from TableB B
left JOIN TableA A ON A.id=B.id
WHERE B.id=4
ELSE
SELECT p_date AS Date,predefinedvalue AS Value
END IF;
您必须使用左连接,因为内连接将仅检索匹配的记录。此外,预定义的值必须存储在B中,因为如果没有匹配的记录,则无法从A中查询任何内容。
SELECT CASE WHEN myvar>0 THEN B.Date
ELSE p_date
END AS Date,
CASE WHEN myvar>0 THEN A.Value
ELSE predefinedvalue
END AS Value
from TableB B
left JOIN TableA A ON A.id=B.id
WHERE B.id=4