2012-03-08 71 views
0

请帮我形成SQL查询...... 我在DB2即SVA1ARTICLE表,SQL查询的特殊情况

表名:具有柱

SVA1ARTICLE 

ID 
KEYWORD1 
KEYWORD2 
KEYWORD3 
KEYWORD4 

要求:

  1. 需要从所有4个单独的关键字列中找出至少重复100次的关键字,即也是唯一的。为前。预算是COL KEYWORD1中的关键字,并重复100次,然后结果将返回预算。同样适用于其他KEYWORD字段。

  2. 从上述查询返回的结果,我们需要找出同一个表中的所有列。即如果上面的查询返回“预算”作为关键字,那么我们需要找出所有具有关键字预算的记录,并给出我们前50个最新的行。

请帮助你的战士与剑的边界只有手中没有额外的弹药。

感谢, 角斗士

+0

我尝试了1分,但如何实现第二我还是不明白..第一,从SVA1ARTICLE中选择KEYWORD1由KEYWORD1组有(KEYWORD1)> 100; – GLADIATOR 2012-03-08 08:13:30

回答

1

我同意zxq9发表。你需要规范你的数据库。中东时间:

“标准化” 的数据:

create view SVA1ARTICLE_N 
as 
    select ID, keyword1 as k 
    from SVA1ARTICLE union all 
    select ID, keyword2 as k 
    from SVA1ARTICLE union all 
    select ID, keyword3 as k 
    from SVA1ARTICLE union all 
    select ID, keyword4 as k 
    from SVA1ARTICLE 

“找出哪些是至少从所有4个 个别关键字栏中重复100次关键字”

create view key_100 
as 
    select k 
    from SVA1ARTICLE_N 
    group by k 
    having count(*) > 100 

“从上述查询的结果返回,我们需要找出同一个表中的所有 列。也就是说,如果上面的查询返回“预算”作为然后关键字 ,我们需要找出所有具有关键字预算 和给我们的第一个50个最新行的记录。”

select distinct id 
from SVA1ARTICLE_N 
where k in (select k from key_100) 

该查询返回ID行,符合你的标准,可以自由地完成你自己从SVA1ARTICLE源表获得最后50行的查询

+0

谢谢先生......这实际上是我在寻找 – GLADIATOR 2012-03-08 09:56:17

0

在我看来你是建模在一个困难的方式的数据。

使用SVA1ARTICLE中的ForeignKey和参考约束条件(使相同SVA1ARTICLE不能从KEYWORD表中引用超过4次)更容易制作KEYWORD表。

如果你这样做,你的查询逻辑变得简单,查询速度会有所提高(创建关键字,用于两个存储的字和参考SVA1ARTICLE索引),你不会是堆放大量分查询以获得您的结果,在规范更改为处理时,例如3或5个关键字(或无限制,这在现有模型中是不可能的)将很难调整。

有了新的模式,您的问题将如何处理:

  1. 设有一个单独的关键词表,你可以拉一个简单的查询,其中单词出现超过任何阈值(在这种情况下,100)。

  2. 从上面的#1的结果,你可以拉具有> 100字(S)的所有文章的一个简单的查询。

可以做到这一点作为一个单一的查询(#2)与子查询(#1)中或在应用为从#1建立一个初始数据列表,然后使2的第二查询#。

直到你调整你的数据模型,用代码详细回答这个问题并不真实。

+0

我明白但我的问题是,这张表在系统很老有数百万行,我没有授权创建新表,所以只需要用这张表做所有事情...... – GLADIATOR 2012-03-08 08:11:20

+0

如果我不被允许转换它,我不会接受这个工作......但是, 。您需要进行长时间的多重查询来构建巨型列表。连接SELECT SVA1ARTICLE,KEYWORD1 AS关键字FROM表的结果;与来自KEYWORD2〜4的查询相同。如果您在“关键字”上对此列表进行排序,您可以找到出现的位置> 100.每个独特的SVA1ARTICLE都是您想要的SVA1ARTICLE列表。我希望这是有道理的。很难在未格式化的评论中解释。 – zxq9 2012-03-08 08:22:12

+0

:)请参考新的一个,如果你知道..... :) – GLADIATOR 2012-03-08 08:24:46