我写了一个看起来像这样的查询:
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) 一次而不是两次并且仍然获得相同的表结果?
如果您在 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
;
如果您的表已正确编制索引,则不会因丢失预过滤的内嵌视图而影响性能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句