Запрос на поиск дублирующегося предмета в 2 таблице - PullRequest
1 голос
/ 28 декабря 2010

У меня есть эта таблица

Antecedent           Consequent
I1                   I2                   
I1                   I1,I2,I3
I1                   I4,I1,I3,I4
I1,I2                I1
I1,I2                I1,I4
I1,I2                I1,I3
I1,I4                I3,I2
I1,I2,I3             I1,I4
I1,I3,I4             I4

Как вы можете видеть, она довольно испорчена.есть ли в любом случае, я могу удалить строки, если элемент в последующем существует в прошлом (в 1 строке)

например: INPUT:

Antecedent           Consequent
I1                   I2                   
I1                   I1,I2,I3    <---- DELETE since I1 exist in antecedent
I1                   I4,I1,I3,I4 <---- DELETE since I1 exist in antecedent
I1,I2                I1          <---- DELETE since I1 exist in antecedent
I1,I2                I1,I4       <---- DELETE since I1 exist in antecedent
I1,I2                I1,I3       <---- DELETE since I1 exist in antecedent
I1,I4                I3,I2       
I1,I2,I3             I1,I4       <---- DELETE since I1 exist in antecedent
I1,I3,I4             I4          <---- DELETE since I4 exist in antecedent

ВЫХОД:

Antecedent           Consequent
I1                   I2  
I1,I4                I3,I2            

В любом случае, я могу сделать это по запросу?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2010

Рико, все правы насчет UDF, делать это с запросами, вероятно, будет медленнее.Добавьте эту функцию в модуль и посмотрите, насколько это быстро.Я запустил его на 500K записей за несколько секунд.

Public Function IsWithin(ByVal vAntecedent As Variant, ByVal vConsequent As Variant) As Boolean
    On Error GoTo ErrQuit
    IsWithin = False
    If Not IsNull(vAntecedent) Then
        If Not IsNull(vConsequent) Then
            Dim aryAnt As Variant, aryCons As Variant
            Dim vAnt  As Variant, vCons  As Variant
            aryAnt = Split(vAntecedent, ",")
            aryCons = Split(vConsequent, ",")
            For Each vAnt In aryAnt
                For Each vCons In aryCons
                    If vAnt = vCons Then
                        IsWithin = True
                        Exit For
                    End If
                Next
                If IsWithin Then Exit For
            Next

        End If
    End If
    Exit Function
ErrQuit:
    IsWithin = False
End Function

Ваш запрос может выглядеть примерно так:

SELECT Antecedent, Consequent
FROM Table1
WHERE IsWithin([Antecedent],[Consequent])=False;
0 голосов
/ 28 декабря 2010

Я не могу понять, как это можно сделать с помощью запроса Access без пользовательской функции, которая предполагает, что может быть проще просто использовать VBA для удаления проблемных строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...