多个' AND'同一列

时间:2017-05-09 16:46:48

标签: sql asp.net ms-access

我在ASP.Net中使用Access 2007数据库,如果某个项目符合多个' AND'那么我需要从表格中提取数据。条款。

例如:

    Select * from tableA
    where tableA.column1 = myvalue1
    and (tableA.column2 = myvalue2
    and tableA.column2 = myvalue3)

('('和')'围绕'和'子句的括号是Access要求)

myvalue1在column1中多次存在,因为column2为column1值存储了许多不同的数据。

但是,我只希望结果显示符合所有column2搜索条件的column1值。

例如,column1包含员工姓氏,column2包含员工的资格。

第1栏中的一名员工可能在第2栏中拥有多项资格。

使用' OR'进行搜索对于拥有所有必要的作业资格的员工而言,该条款将为每位员工生成一个包含多行的表格。

对于持有每项所需资格的每位员工,只需一行即可。

让我们说员工A具有资格X,Y和Z.每次将资格添加到第2列时,员工的姓名将在第1列中排成一行,因此员工的姓名名称出现在column1中3次。假设现在员工B也具有资格X,Y和Z,但员工C具有W,X和Y.如果任务需要资格X,Y和ZI不希望员工C出现在搜索结果中作为员工C没有获得相关资格。

当我使用上述'选择'命令只有一个'和'条款搜索工作正常,但有两个'和'条款没有返回,即使我知道第1列中的项目符合'和'标准。

在'和'的串联中我缺少什么?条款?

3 个答案:

答案 0 :(得分:1)

根据新信息,我将提交以下答案:

我的直觉是,您无法在一个简单的查询中执行此操作。这听起来很狡猾,但我认为您需要创建一个SELECT DISTINCT查询的查询,并且该查询将为每个员工提取一条记录:

Select DISTINCT Column1 from tableA

将此查询称为qryEmployees

接下来,您需要创建一个新表。称之为tblQualifications。它将包含2个字段; EName和EQualifications。我们将在一分钟内填写。

接下来,您需要遍历qryEmployees中的每条记录,并将员工姓名及其资格写入tblQualifications。

'Run through every Employee name
Do While qryEmployees.EOF = False
  'Set up a temp variable, MyQual, and set it equal to Empty
  MyQual = ""
  'Pull all qualifications from TableA for the current Employee
  Set rec = db.OpenRecordset ("Select Column1, column2 from TableA WHERE Column1 = '" & qryEmployees.Column1 & "'")
  'Looping through the qualifications
  Do While rec.EOF = False
    'Add the qualification to the MyQual string
    MyQual = MyQual & rec("Column2") & ", "
    rec.MoveNext
  Loop

  'Now that we have all the qualifications in a string, trim off the last ", "
  MyQual = left(MyQual, len(MyQual)-2)

  'Open up tblQualifications and fill it with the Employee and a string of all of their qualifications
  tblQualifications.AddNew
    tblQualifications(0) = qryEmployees.Column1
    tblQualifications(1) = MyQual
  tblQualifications.Update

'Move on to the next Employee and repeat the process
qryEmployees.MoveNext
Loop

现在,您在一个字段中有一个包含“员工姓名”的表,以及下一个字段中的所有资格。如果您在此表上使用LIKE运算符,则应该得到结果。

Select * from tblQualifications
where tblQualifications.EName = myvalue1
and (tblQualifications.EQualifications LIKE myvalue2
and tblQualifications.EQualifications LIKE myvalue3)

它并不漂亮,但它会起作用(上面的代码稍微放了一点,因为我把它写在了我的头顶并且未经测试)。

答案 1 :(得分:0)

以下解决方案可行,但性能会受到影响。这将返回每人1行,我可以重写它以返回两行。

Select * from tableA
where tableA.column1 = myvalue1
and (tableA.column2 = myvalue2
and DCount("column2", "TableA", "column1 = """ & column1 & """ AND column2 = """ & myvalue3 & """" ) <> 0)

您的基本问题是没有group by或pivot子句的select查询一次只能评估1行。我可能会转移数据,将其连接起来,然后对其进行评估以获得更好的性能。但这更复杂,需要有关表结构的更多信息以及您想要做的事情。

答案 2 :(得分:0)

感谢Johnny,您的建议激发了我对解决方案采用略有不同的方法。

我换了&#39; AND&#39;一个&#39; OR&#39;正如其他人已经建议,如果他们具有任何资格,就将任何员工提取到一个表中。

结果是一张表格,其中包含具有这些资格之一的每位员工的所有必需资格。

然后,我在其他地方计算了转让所需的资格数量,并将其与员工是否具有所需的资格数量进行了比较,如下所示:

    Dim objSearchTable As DataTable = DSSearch.Tables("Employees")

    Dim i As Integer

    If QualificationsCount > 0 Then

        For i = 0 To objSearchTable.rows.count - 1

            strEmployee = objSearchTable.Rows(i).Item("column1")

            Dim foundRows As DataRow() = objSearchTable.[Select]("column1 = '" & strEmployee & "'")

            Dim numberOfRecords As Integer = foundRows.count

            If numberOfRecords < QualificationsCount Then

                objSearchTable.Rows(i).Delete

            End If

        Next

    End If

    objSearchTable.AcceptChanges

如果资格计数小于所需数量,则会从表中删除员工的每个实例。

解决方案并不像从数据库中提取正确的员工一样优雅。

从数据库中提取每个员工也会产生一些开销,但最终结果是每个员工只有一行并且具有所有资格的表,这就是我需要的。