2012-08-30 31 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。*'(现在已修复)之后缺少的逗号。 –

相关问题