2012-08-30 64 views
0

我在構建特定查詢以選擇記錄時遇到問題。這是我試圖實現的一個愚蠢的例子。特定查詢選擇表A中與表B行中定義的標準不匹配的所有行?

比方說,我有一個名爲Criteria表看起來是這樣的:

ID Unit  Product Part 
== ======== ======= ======== 
1 'sports' 'bike' 'handle' 
2 'sports' ' '  ' ' 
3 'furn' 'couch' ' ' 
etc. 

而且我有一個名爲Entries表看起來是這樣的:

ID Tuple 
== ========================= 
1 'sports/bike/seat' 
2 'sports/racket/frame' 
3 'furn/desk/leg' 
4 'furn/lamp/shade' 
etc. 

記錄1 Criteria建議任何「體育/自行車/手柄」元組都是合格的。在Criteria中記錄2,其中ProductPart包含空格,表示以'sports'開頭的任何元組符合(「sports /%/%」)。記錄3表明任何以'furn'和'couch'開頭的元組符合(「furn/couch /%」)。我想選擇不符合符合任何條件的所有記錄。

在這種情況下,應該返回來自Entries的記錄3和4,因爲它們不符合任何給定條件。

我是新來的SQL,所以我遇到了麻煩提出一個合適的查詢。我的思維過程是沿着這些線路:

對於Criteria每個記錄,建立基於該UnitProductPart字符串比較字符串。例如,對於記錄1,字符串將是「運動/自行車/手柄」。對於記錄2,字符串將是'sports /%/%',並且對於記錄3:'furn/couch /%'。現在,選擇Tuple不等於任何這些字符串的所有記錄。我無法將其轉換爲SQL條款,而這正是我需要您的幫助的地方。

+1

對不起,但我會考慮重新設計表,而不是試圖使它工作! – Parallelis

+1

你爲什麼在真正的元組(行)內的列中存儲元組?使3值3列! –

+0

大聲笑,我知道你們會嚇壞了。當我第一次得到這個項目時,我也做了。元組被存儲爲字符串,因爲它們來自其他地方。這是不幸的,令人討厭的,但這一點不能改變。如果不提供詳細信息,我很難解釋:我不應該這樣做:P – Dalal

回答

2

你爲什麼要存儲這樣的數據?詢問頭腦想知道。

但是,你可以嘗試沿着這些路線的東西:

select * 
from entries e 
where not exists (select * 
        from criteria c 
        where e.tuple like   case coalesce(unit , '') when '' then '%' else unit end 
             + '/' + case coalesce(product , '') when '' then '%' else product end 
             + '/' + case coalesce(part , '') when '' then '%' else part end 
       ) 

醜陋,但控釋片「呃完成。

+0

數據本來不是用來解析和分離的 - 它只是一個單獨的識別字符串。只是現在他們希望以不同的方式使用它。嗯,明天我會檢查你的解決方案。謝謝! – Dalal

+0

這工作得很好。謝謝。 – Dalal

2

你可以做到這一點與外連接,使用這樣的:

select e.* 
from Entries e left outer join 
    (select c.*, 
      ((case when c.unit = ' ' then '%' else c.unit end) + '/' + 
       (case when c.product = ' ' then '%' else c.product end) + '/' + 
       (case when c.part = ' ' then '%' else c.part end) 
      ) as likestr 
     from Criteria c 
    ) c 
    on e.tuple like likestr 
where c.id is null 

這將是一個昂貴的操作,但應該做你想要什麼。

如果您將元組的元素存儲在單獨的列中,數據結構會更有意義。然後你可以做一個專欄比較。

+0

感謝您的回覆。我明天會試試這個。 (是的,我希望他們被逐列存儲!) – Dalal

+0

我無法得到它的工作。有一個語法錯誤,我不知道在哪裏。 – Dalal

+1

@達拉爾:或許這是一個在'c。*'(現在已修復)之後缺少的逗號。 –

相關問題