如果重要,我正在使用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
答案 0 :(得分:1)
您的规格有点模糊。如果您提供了一些架构,它会有所帮助。关键字表只是单词还是给定实体的关键字列表?如果至少存在一个RequiredKeyword但不是所有关键字都需要,会发生什么?非必需关键字是否应显示或仅应显示该方案中所需的关键字?如果要返回必需和非必需关键字,那么所需关键字列表如何影响结果?以下是一些可能的解决方案:
情景1:
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:
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:
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
)