我正在尝试实现一个想法,我在数据库中有两个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
并通过DataTable
和SqlDataAdapter
我使用SQL命令填充GridView4
:
SELECT DISTINCT Info.Nationality WHERE Exclusion.Keyword NOT LIKE '%Spanish%'
该SQL语句检索Info.Nationality
中不包含单词spanish的所有不同记录。
我目前正在做的是,在vb.net中的网络应用中,我添加了两个不同的GridViews
,每个都有每个表的数据,这意味着GridView2
有{{1}并且DISTINCT Info.Nationality
已GridView3
,然后添加另一个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.Nationality
中GridView4
的所有记录,其中不包含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
个数据。
非常感谢您对此的建议和想法。
答案 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中的所有行,并在排除列中插入空值,除非连接条件匹配。通过仅过滤那些值为空的位置,可以避免匹配。