1

我正在尝试实现一个想法,在数据库中有两个 sql 表。

具有字段的表和Info具有字段的Nationality另一个表。ExclusionKeyword

`Info.Nationality`               `Exclusion.Keyword`

    |British|                     |France|  
    |resteraunt de France|        |Spanish|
    |German|
    |Flag Italian|
    |Spanish rice|
    |Italian pasta
    |Irish beef|

在我的 Web 应用程序中,我正在创建一个GridView4并通过 aDataTable并使用 SQL 命令SqlDataAdapter填充它:GridView4

SELECT DISTINCT Info.Nationality WHERE Exclusion.Keyword NOT LIKE '%Spanish%'

该 SQL 语句检索所有Info.Nationality不包含单词 spanish 的不同记录。

我目前正在做的是在 vb.net 中的 web 应用程序中添加两个不同GridViews的,每个都有每个表的数据,这意味着GridView2hasDISTINCT Info.NationalityGridView3hasExclusion.Keyword然后添加另一个 GridView4以显示上述结果SQL command

这个想法是检索所有不同的记录,Info.Nationlity这些记录没有被 中的关键字约束抑制Exclusion.keyword。因此,从上面提到的 Sql 命令中,GridView4将检索所有不包含“Spanish”一词的记录。

我在一个嵌套循环中执行所有这些操作,在第一个循环中,它从egfor中获取每条记录(一个接一个),并将其与第二个 for 循环进行比较,直到该循环结束。Info.Nationalityfor each row As DataRow in Me.GridView2.Rows()Exclusion.KeywordFor i=0 To Gridview3 - 1

问题是在那个 sql 语句中我必须明确指定要比较的单词。我尝试Exclusion.Keyword在 a 中添加记录,String然后将Spanishin 之间的关键字替换为isNOT LIKE的名称,然后将名称分配为参数。但是,这不起作用,它仅与字符串中的最后一条记录进行比较并忽略第一条记录。StringKeywordscmd.parameter.addwithvalue(@String, Keywords)

所有这一切背后的想法是显示其中不包含关键字 in 的Info.Nationality所有记录。GridView4Exclusion.Keyword

有没有更简单或更有效的方法来做到这一点?我在想一个,Inner Join with a Like command但这不是我的问题。我的问题是如何将每条记录与其中的Info.Nationlity所有记录一一进行比较Exclusion.keyword,然后检索不匹配的记录并丢弃匹配的记录。

那么Gridview4我如何编辑记录而不反映这些更改或影响,Info.Nationality而只影响Inserting to Exclusion.Keyword更改。

通过在我的asp.net网络应用程序中添加ToString()后解决Text ,我尝试了这个,但没有用:(已解决

 `SELECT DISTINCT Nationality 
FROM Info Where NOT EXISTS(SELECT * FROM Exclusion WHERE Info.Nationality LIKE '%' + @GridView +'%')`

`cmd.parameters.AddwithValue("@GridView", GridView3.Rows(i).Cells(0).Text.ToString())`

GridView3这里有Exclusion.Keywords数据。

非常感谢您对此提出的建议和想法。

4

1 回答 1

1

您不需要一个接一个地执行此操作,或者“通过痛苦的行来进行操作”,因为某些 DBA 喜欢描述这种类型的方法。有很多方法可以编写查询以仅将 Info.nationality 中与排除关键字不匹配的记录作为单个表达式返回。

我的偏好是使用EXISTS子句和相关子查询:

SELECT Nationality 
FROM Info I
WHERE NOT EXISTS(SELECT * FROM Exclusion WHERE I.Nationality LIKE '%' + Keyword + '%')

您也可以将其表示为left join.

SELECT I.Nationality 
FROM Info I
    LEFT OUTER JOIN Exclusion E 
        ON I.Nationality LIKE '%' + E.Keyword + '%'
WHERE E.Keyword IS NULL 

left join返回 info 中的所有行,并在排除列中插入空值,但连接条件匹配的地方除外。通过仅过滤那些值为空的地方,您可以避免匹配。

于 2012-12-07T08:29:41.273 回答