2010-05-08 53 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