选择表A中与表B行中定义的条件不匹配的所有行的特定查询?

时间:2012-08-30 01:08:39

标签: sql sql-server-2008-r2

我在构建特定查询以选择记录时遇到问题。这是我正在努力实现的一个愚蠢的例子。

假设我有一个名为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.

Criteria中的记录1表明任何“运动/自行车/手柄”元组都有资格。 Criteria中的记录2,其中ProductPart包含空格,表示任何以'sports'开头的元组都符合条件(“sports /%/%”)。记录3表明任何以'furn'和'couch'开头的元组都符合条件(“furn / couch /%”)。我想选择符合任何条件的所有记录。

在这种情况下,应返回Entries中的记录3和4,因为它们与任何给定标准都不匹配。

我是SQL新手,因此我无法提出合适的查询。我的思考过程是这样的:

对于Criteria的每条记录,根据UnitProductPart构建字符串比较字符串。例如,对于记录1,字符串将是'sports / bike / handle'。对于记录2,字符串将是'sports /%/%',并且记录3:'furn / couch /%'。现在,选择Tuple不等于任何字符串的所有记录。我无法将其转换为SQL术语,这就是我需要你帮助的地方。

2 个答案:

答案 0 :(得分: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

这将是一项昂贵的操作,但应该做你想做的事。

如果将元组的组件存储在单独的列中,则数据结构会更有意义。然后你可以进行逐列比较。

答案 1 :(得分: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
                 )

丑陋,但是gits完成了。