2017-07-18 64 views
0

我寫了一個查詢,如下所示: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)一次而不是兩次,並仍然實現相同的表結果?

+0

標記正在使用的正確數據庫 –

+1

Oracle中沒有'getdate()'函數。你真的**使用哪些DBMS? –

+0

我正在使用Oracle SQL Developer – Deb

回答

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 
; 

如果你的表是正確的索引,不應該有輸了預過濾的在線訪問量創下了性能。

+0

我無法加入q_id,因爲前兩個表是多對多關係(許多s_id到許多q_id),這就是爲什麼我在加入前兩個表之前首先在q_id上進行過濾的原因,然後加入s_id。我不能以相反的方式去做(在q_id上過濾並加入到s_id中),以達到我需要實現的目的。理想情況下,我會加入q_id和s_id組合,這將是唯一的,但我試過了,它返回了一個空tabe。 – Deb

+0

它加入了兩列!我早些時候可能犯了一些錯誤。非常感謝您對日期的建議。 – Deb

+0

很高興工作! – dreamwork