1

我有两个表(A 和 B),其中我的查询将表 A 中的计算与表 B 中的范围进行比较,然后根据日期将相应的值插入到第三个表(表 C)中的范围(也在表 B 中) . 但是,表 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 EXISTSWHERE子句中嵌入如下内容的方法:

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)`

上面的查询是解释我正在尝试做什么的示例,因此,它不是一个有效的查询。我不想使用子查询来解决明显的性能问题。

我将不胜感激。在此先感谢 :)

4

1 回答 1

2

那这个呢

更新

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 
于 2013-09-18T07:23:32.133 回答