2010-08-25 84 views
3

我需要查询以下问题。表1指定了强制输入字段。我将获取字段与不活动='否'和mandt字段='是'查询字符串操作

所以我有4个记录与字段为sev,sev1,cde,frt。

表1:

Fields     Inactive    mandt_field 

sev      no      yes 
sev1     no      yes 
sev2     yes      yes 
abd      no      no 
cde      no      yes 
frt      no      yes 

表2具有类似于此

concession   add_fields 

TH-123    -sev*yes-sev1*no-sev2*yes 
Th-234    -sev*yes-sev1*yes-cde*yes-frt*no 
Th-345    -sev*yes-cde*yes-frt*no 
TH-456    -cde*no-frt*no 
Th-012    -sev*no-sev1*no-cde*no-frt*no 
Th-451    -frt*yes 
TH-900    -sev2*no 

现在我需要不具有在add_fields,传入三个以上4个字段的记录的数据。 输出应返回以下记录: - TH-123,TH-345,TH-456,TH-451,TH-900。

这4条记录并不包含我们从前一个表(sev,sev1,cde,frt)检索到的所有4个字段。

The no。从表1得到的字段的可能vary..As这些都是从表中的数据......所以我们可以有(SEV,sev1,CDE,FRT ....)

+0

你不能把table2放入第一范式来避免这种类型的问题吗? – 2010-08-25 07:46:05

+0

@Martin - 如果我正确地理解了你,我有一个名为特许的table2中的唯一键。在这个帮助下,我能够确定一个独特的记录。如果你的意思是将列add_fields分割到不同的字段中。没有。的字段随用户输入而动态变化。如果我不清楚,请告诉我。 – satya 2010-08-25 07:51:49

+0

不,我的意思是将'add_fields'分成组成项目并将它们存储为行。 – 2010-08-25 08:02:01

回答

2

要回答你原来的问题

SELECT DISTINCT concession 
FROM Table2 
INNER JOIN Table1 ON Table2.add_fields NOT LIKE '%-' + Table1.Fields + '*%' 
WHERE Inactive='no' AND mandt_field='yes' 

继续从评论add_fields似乎包含项目列表。这又包含成对的代码和是/否的值。我建议如下重构你的table2。这会将其放入first normal form

将它放入第一个标准格式将会使更新和搜索更容易,而不必每次都解析每个字符串以将其分解为其组成项目。它也将允许您对数据应用完整性约束。

concession code YesNo 
---------------------------- 
TH-123  sev  yes 
TH-123  sev1  no 
TH-123  sev2  yes 
Th-234  sev  yes 
.... 
0

简答:很可能你不想尝试。

取而代之,从表2创建第三个表,其中包含相同的数据,但是可以使用一种形式。这意味着到外地add_fields拆分成多列,因此您可以使用连接对表Table1

龙回答:SQL是完整的巡回演出,所以你可以写任何程序(mandelbrot set in T-SQL)。但是这很快就会变得复杂,所以你真的不想这么做。

+0

关于简短的回答,我无法将add_fields分割为单独的列。由于没有。的字段随用户输入而动态变化。如果他们在I/P屏幕上添加10个字段,那么我需要10列。根据现在的要求,数字的范围为20。 – satya 2010-08-25 08:23:07

+0

您必须将字段拆分为单独的**行**,否则它们在连接中无用。这就是马丁史密斯在回答中所做的事情,并且你看到代码有多笨拙。 – 2010-08-25 09:21:56