SQL条件选择Oracle sql

时间:2017-07-18 13:54:08

标签: variables conditional oracle-sqldeveloper

我写了一个如下所示的查询:

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)一次而不是两次,仍然可以实现相同的表结果?

1 个答案:

答案 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
;

如果你的表被正确编入索引,那么丢失预先过滤的内联视图就不会有性能损失。