我写了一个如下所示的查询:
select
q_id,
s_id, no,
date,
nm,
p
from
(select * from table1 where q_id = 100) tb1
left join
(select * from table2 where q_id = 100 and date = left(getdate(),11)) tb2
on tb2.s_id = tb1.s_id
join
table3 tb3
on tb3.s_id = tb1.s_id
order
by no ASC;
我将它放入java控制器,q_id将是输入变量。无论如何,我可以修改查询,以便我将值赋值给q_id(q_id = 100)一次而不是两次,仍然可以实现相同的表结果?
答案 0 :(得分:0)
如果您在tb1和tb2内联视图的WHERE子句中使用相同的q_id列,则应该根据该条件加入tb1和tb2。然后,您只需要一个引用q_id的WHERE条件。
另外,正如a_horse_with_no_name所评论的那样,我不太确定你试图用get_date()函数完成什么。对于我的例子,我假设你试图通过仅返回当天的结果来过滤结果。为此,我使用了sysdate和TRUNC函数。如果您正在尝试完成其他操作 - 请相应地修改WHERE子句。
作为旁注,我建议仅使用显式变量引用并避免使用'SELECT *',尤其是在有关堆栈交换的问题时。话虽如此,我不确定变量'nm','no'和'p'来自哪个表。我以为他们来自表3。
SELECT
TB1.q_id,
TB1.s_id,
TB2.date,
TB3.no,
TB3.nm,
TB3.p
FROM table1 TB1
INNER JOIN table3 TB3
ON TB1.s_id = tb3.s_id
LEFT JOIN table2 TB2
ON TB1.s_id = TB2.s_id
AND TB1.q_id = TB2.q_id
WHERE TRUNC(TB2.date) = TRUNC(sysdate)
AND TB1.q_id = 100
ORDER BY
TB3.no ASC
;
如果你的表被正确编入索引,那么丢失预先过滤的内联视图就不会有性能损失。