2010-05-08 55 views
0

如果它很重要,我使用的是Firebird 2.1數據庫。SQL篩選多個表數據

我有三個表格,一個是關鍵字,一個是否定關鍵字,另一個是必需的關鍵字。我需要能夠對數據進行過濾,以便輸出只包含那些不在負面關鍵字列表中的規定的關鍵字,並且如果有任何必需的關鍵字,那麼它將要求結果最終具有這些關鍵字結果。

這些表格非常相似,我要匹配的表格中的字段都被稱爲關鍵字。

我根本不知道SQL。我猜這將是像SELECT關鍵字從keywordstable其中關鍵字在requiredkeywordstable和其中不在關鍵字穩定

只是一個側面說明,所需的關鍵字表可能是空的這將意味着沒有必需的關鍵字。

任何幫助,將不勝感激。

實施例的表:

KeywordsTable -keywords VARCHAR 255個 RequiredKeywordsTable -keywords VARCHAR 255個 NegativeKeywordsTable -keywords VARCHAR 255

實施例的數據: KeywordsTable 貓 狗 鼠標 馬 衆議院

在Negative和Required關鍵字表中沒有設置Nothing,那麼輸出將只是關鍵字表數據不變。

IF RequiredKeywordsTable有汽車,貓的價值,狗則輸出將與貓狗

如果NegativeKeywordsTable有馬和requiredkeywords的值是空的,則關鍵詞表的輸出是貓,狗,鼠標,房子。

等。

-Brad

回答

0

你的規範是幾分朦朧。如果你提供了一些模式,它會有所幫助。關鍵字表格是單詞還是它是給定實體的關鍵字列表?如果至少存在一個RequiredKeyword但不是所有關鍵字都是必需的,會發生什麼情況?非必需的關鍵字是否應顯示該應用場景中的關鍵字?如果需要和不需要的關鍵字都應該返回,那麼所需關鍵字列表如何影響結果?下面是一些可能的解決方案:

方案1:

  1. 這三個表是一個給定的實體按鍵的關鍵字。
  2. EntityKey不可爲空。
  3. 如果給定的實體具有必需的關鍵字,則只顯示必需的關鍵字。
Select ... 
From Keywords As K 
    Left Join NegativeKeywords As NK 
     On NK.EntityKey = K.EntityKey 
    Left Join RequiredKeywords As RK 
     On RK.EntityKey = K.EntityKey 
Where NK.EntityKey Is Null 
    And (
     Not Exists (
        Select 1 
        From RequiredKeywords As RK1 
        Where RK1.EntityKey = K.EntityKey 
        ) 
     Or RK.EntityKey Is Not Null 
     )

方案2:

  1. 只有關鍵詞表是一個給定的實體按鍵或僅僅是語言,而是另外兩個是必需的,否定關鍵字的列表。
  2. 所有三個表中的關鍵字列不可爲空。
  3. 如果存在甚至一個關鍵字需要,然後才需要的關鍵字應該顯示:
Select ... 
From Keywords As K 
    Left Join NegativeKeywords As NK 
     On NK.Keyword = K.Keyword 
    Left Join RequiredKeywords As RK 
     On RK.Keyword = K.Keyword 
Where NK.Keyword Is Null 
    And (
     Not Exists (
        Select 1 
        From RequiredKeywords As RK1 
        Where RK1.Keyword = K.Keyword 
        ) 
     Or RK.Keyword Is Not Null 
     )

方案3:

  1. 的關鍵詞表是空談
  2. 關鍵字列在所有三個表中都不能爲空。
  3. 系統應返回是否需要給定關鍵字,但也應顯示非必需的關鍵字。
Select ... 
    , Case When RK.Keywords Is Not Null Then 1 Else 0 End As IsRequired 
From Keywords As K 
    Left Join NegativeKeywords As NK 
     On NK.Keyword = K.Keyword 
    Left Join RequiredKeywords As RK 
     On RK.Keyword = K.Keyword 
Where NK.Keyword Is Null

加成

鑑於你更多的信息,這裏是你如何解決這個問題。首先,根據你說的,我假定架構看起來類似:

Create Table Keywords(Keywords varchar(255) not null primary key) 
Create Table NegativeKeywords(Keywords varchar(255) not null primary key ) 
Create Table RequiredKeywords(Keywords varchar(255) not null primary key ) 

如果Keywords列是唯一的專欄中,我將使它不能爲空和主鍵。這可以確保你沒有重複,並讓我們依靠列不能爲空來檢查不存在的事實。如果關鍵字列在NegativeKeywords和/或RequiredKeywords表中可以爲空,則問題顯得更加難以解決。

Insert Keywords(Keywords) Values('Cat') 
Insert Keywords(Keywords) Values('Dog') 
Insert Keywords(Keywords) Values('Mouse') 
Insert Keywords(Keywords) Values('Horse') 
Insert Keywords(Keywords) Values('House') 

Select ... 
From Keywords As K 
    Left Join NegativeKeywords As NK 
     On NK.Keywords = K.Keywords 
    Left Join RequiredKeywords As RK 
     On RK.Keywords = K.Keywords 
Where NK.Keywords Is Null 
    And (
     Not Exists (
        Select 1 
        From RequiredKeywords As RK1 
        Where RK1.Keywords = K.Keywords 
        ) 
     Or RK.Keywords Is Not Null 
     ) 
+0

我添加了一個例子,可能會讓它更清楚我要找的東西。 – Brad 2010-05-13 20:56:30

+0

@Brad - 我已經更新了我的文章,給出您的新信息。 – Thomas 2010-05-13 22:11:06

+0

您的示例在IB Expert中完美工作,但是當我嘗試將它與Zeos一起使用時,它似乎不起作用。 :( 謝謝您的幫助! – Brad 2010-05-13 23:40:41