SQL筛选多个表数据

时间:2010-05-08 21:28:11

标签: mysql firebird sql

如果重要,我正在使用Firebird 2.1数据库。

我有三个表,一个包含关键字,一个包含否定关键字,另一个包含必需的关键字。我需要能够过滤数据,因此输出只包含不在负面关键字列表中的规定的关键字,如果有任何所需的单词,那么它将要求结果最终具有这些关键字结果

这些表非常相似,我要匹配的表中的字段都称为关键字。

我根本不懂SQL。我猜它会像关键字中的SELECT关键字一样,其中requiredkeywordstable中的关键字以及不在negativekeywordstable中的关键字

只是旁注,所需的关键字表可能为空,这意味着没有必需的关键字。

任何帮助都将不胜感激。

表格示例:

KeywordsTable -Keywords varchar 255 RequiredKeywordsTable -Keywords varchar 255 NegativeKeywordsTable -Keywords varchar 255

示例数据: KeywordsTable 猫 狗 老鼠 马 房子

如果在否定关键字表和必需关键字表中未设置任何内容,那么输出将只是关键字表数据不变。

IF RequiredKeywordsTable具有Car,Cat,Dog的值,那么输出将是和Cat Dog

如果NegativeKeywordsTable的值为Horse且requiredkeywords为空,则关键字表的输出将为cat,dog,mouse,House。

等。

-Brad

1 个答案:

答案 0 :(得分:1)

您的规格有点模糊。如果您提供了一些架构,它会有所帮助。关键字表只是单词还是给定实体的关键字列表?如果至少存在一个RequiredKeyword但不是所有关键字都需要,会发生什么?非必需关键字是否应显示或仅应显示该方案中所需的关键字?如果要返回必需和非必需关键字,那么所需关键字列表如何影响结果?以下是一些可能的解决方案:

情景1:

  1. 这三个表是给定实体密钥的关键字。
  2. EntityKey不可为空。
  3. 如果给定的实体具有必需的关键字,则只显示必需的关键字。
  4. 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. 如果甚至存在一个必需的关键字,则只显示必需的关键字:
    4. 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. 系统应返回是否需要给定关键字,但也应显示不需要的关键字。
      4. 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
                )