2014-07-21 68 views
0

我正在創建一個查詢生成器,以便將業務規則轉換爲針對Oracle數據庫運行的SQL查詢。規則基本上是「所有符合這些標準的項目都應與符合這些標準的項目相關」。太多的思考和深思熟慮之後,我決定,要做到這一點,最好的方法是使用SQL加盟兩組:Oracle - 此查詢是否可以簡化或重新組織?

  1. 該組匹配的FROM標準(A)的所有項目的
  2. 套所有的與符合TO標準的項目相匹配的項目(B)

B必須是A的子集。我將確定是否通過從A中減去B並期望空集。如果該集合不爲空,則不符合規則。

「SQL連接」有很多Google圖像搜索結果,顯示如何使用不同類型的連接語句表示各種集合關係,如this image。一個我想與去(爲A - B)將是對左側中間的一個:

select A.id 
    from items A 
left join items B 
     on A.id = B.id 
    where B.id = null 

顯然,我的查詢比這複雜得多。我一直這樣做的方式是讓B成爲子查詢。我還必須包含關係表,然後添加條件。由此產生的模板:

select A.id 
    from items A 
left join (
      select A.id 
      from items A 
      join relationships rel 
       on rel.from_item = A.id 
      join items to 
       on rel.to_item = to.id 
      where [from criteria] 
      and [to criteria] 
     ) B 
     on A.id = B.id 
    join relationships rel 
     on rel.from_item = A.id 
    where B.id = null 
     and [from criteria] 

有沒有更好的方法,在語法上,我執行我正在執行的查詢?

我想象一下,我可以構造查詢A像某個臨時表一樣,然後從查詢A構造查詢B,然後讓一個最終查詢將它們連接在一起並返回結果。那可能嗎?

回答

2

這聽起來像你想的子查詢factoring--的WITH條款

WITH first_set AS (
    select A.id 
    from items A 
     join relationships rel 
      on rel.from_item = A.id 
     join items to 
      on rel.to_item = to.id 
    where [from criteria] 
), 
second_set AS (
    select a.id 
    from first_set a 
    where [to criteria] 
) 
SELECT a.id 
    FROM first_set a 
     left join second_set b 
     on a.id = b.id 
WHERE b.id IS NULL 

就個人而言,我會覺得更清晰的建設時,最終的查詢使用NOT EXISTSMINUS,而不是做一個LEFT JOIN和檢查NULLLEFT JOIN方法的作品,它可能會像其他選擇一樣有效。它總是讓我覺得有點違反直覺。

+0

這正是我所期待的。謝謝! – jchitel