SQL 条件选择 Oracle sql

SQL conditional selection 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) 一次而不是两次并且仍然获得相同的 table 结果?

如果您在 tb1 和 tb2 内联视图的 WHERE 子句中使用相同的 q_id 列,则您应该根据该标准加入 tb1 和 tb2。然后,您只需要一个引用 q_id.

的 WHERE 条件

此外,正如 a_horse_with_no_name 评论的那样,我不太确定您试图使用 get_date() 函数完成什么。对于我的示例,我假设您正在尝试通过仅返回当天的结果来过滤结果。为此,我使用了 sysdate 和 TRUNC 函数。如果您正在尝试完成其他事情 - 相应地修改 WHERE 子句。

作为旁注,我建议仅使用显式变量引用并避免 'SELECT *',尤其是在询问有关堆栈交换的问题时。话虽如此,我不确定变量 'nm'、'no' 和 'p' 来自哪个 table。我以为他们来自 table 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
;

如果您的 table 索引正确,那么丢失预过滤的内嵌视图应该不会影响性能。