2012-03-08 73 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