SQL条件选择Oracle sql

黛布

我写了一个看起来像这样的查询:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章