2017-07-18 28 views
0

私は次のようになり、クエリ書きました:私はJavaのコントローラにこれを入れていますし、q_idは、入力変数になります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; 

を。とにかく、Q_id(q_id = 100)に値を2回割り当てずに割り当て、同じテーブル結果を達成できるように、クエリを変更することはできますか?

+0

使用している正しいデータベースにタグを付けてください –

+1

Oracleには 'getdate()'関数はありません。 **どのDBMSを実際に使用していますか? –

+0

私はOracle SQL Developerを使用しています – Deb

答えて

0

tb1とtb2のインラインビューのWHERE句で同じq_id列を使用している場合は、その条件でtb1とtb2を結合する必要があります。次に、q_idを参照するWHERE条件が1つだけ必要です。

また、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

最初の2つのテーブルが多対多の関係(多くのs_idから多くのq_id)であるため、q_idに参加できません。 s_idに参加します。私は達成する必要がある目的のために、それ以外の方法(q_idのフィルタとs_idのフィルタリング)を行うことはできません。理想的には、私は一意になるq_idとs_idの組み合わせに参加しますが、私はそれを試み、空のtabeを返しました。 – Deb

+0

それは2つの列に参加することで機能しました!私はおそらく以前にいくつかの間違いを犯したでしょうありがとう、そして、日付に関する提案に感謝します。 – Deb

+0

うれしかった! – dreamwork