比较两个表的记录并丢弃匹配

时间:2012-12-07 08:24:12

标签: asp.net sql sql-server vb.net vb.net-2010

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

Info,其中包含字段Nationality,另一个表Exclusion包含字段Keyword

`Info.Nationality`               `Exclusion.Keyword`

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

在我的网络应用程序中,我正在创建GridView4并通过DataTableSqlDataAdapter我使用SQL命令填充GridView4

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

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

我目前正在做的是,在vb.net中的网络应用中,我添加了两个不同的GridViews,每个都有每个表的数据,这意味着GridView2有{{1}并且DISTINCT Info.NationalityGridView3,然后添加另一个Exclusion.Keyword以显示上述GridView4的结果。

我们的想法是从SQL command中检索未被Info.Nationlity中的关键字约束所抑制的所有不同记录。因此,从上面提到的Sql命令,Exclusion.keyword将检索所有没有“西班牙语”一词的记录。

我在嵌套的GridView4循环中完成所有这些操作,在第一个循环中,它从for获取每个记录(逐个),例如Info.Nationality并将其与第二个循环进行比较for循环直到for each row As DataRow in Me.GridView2.Rows()的结尾,就像Exclusion.Keyword

问题是在那个sql语句中我必须明确指定要比较的单词。我尝试在For i=0 To Gridview3 - 1中添加Exclusion.Keyword的记录,然后将String关键字替换为Spanish之间的NOT LIKE名称String Keywords 1}}然后使用cmd.parameter.addwithvalue(@String, Keywords)为名称指定参数。但是这不起作用,它只是与字符串中的最后一条记录进行比较而忽略了第一条记录。

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

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

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

ToString()之后添加Text

已解决 在我的asp.net网络应用程序中,我试过这个,但没有用:( 已解决

 `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个数据。

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

1 个答案:

答案 0 :(得分: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中的所有行,并在排除列中插入空值,除非连接条件匹配。通过仅过滤那些值为空的位置,可以避免匹配。