2010-12-28 8 views
1

Ich habe diese TabelleAbfrage doppeltes Element in Tabelle 2

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 

zu finden, wie Sie es sehen können ziemlich vermasselt. ist es trotzdem kann i Zeilen entfernen, wenn das Element in daraus folgenden in antecedent existiert (in 1 row)

zum Beispiel: 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 

OUTPUT:

Antecedent   Consequent 
I1     I2 
I1,I4    I3,I2    

ist es trotzdem i kann das durch Abfrage tun?

+0

Warum Zeile 7 gelöscht werden sollte? Und warum ist Zeile 8 im Ergebnis? – Hons

+0

woopsie ... bearbeitet – Rico

Antwort

0

Ich kann nicht sehen, wie dies durch eine Access-Abfrage ohne eine benutzerdefinierte Funktion getan werden kann, die darauf hindeutet, dass es einfacher sein kann, einfach VBA zu verwenden, um die Problemzeilen zu löschen.

+0

ich sehe .. ich habe versucht, mit VBA und es dauerte sehr lange zu verarbeiten. aber danke trotzdem – Rico

+0

@Rico Vielleicht könnten Sie in zwei Stufen versuchen? Löschen Sie das einfache Konsequent wie * Antece- dent *, dann 'SELECT FROM Tabelle WHERE Instr (Consequent,", ")> 0' für die weitere Verarbeitung. Sie können die VBA auch gerne posten, falls sich jemand etwas schneller überlegen kann. – Fionnuala

+0

Ein anderer Ansatz wäre, normalisierte Daten in eine temporäre Tabelle zu schreiben, dann die einzelnen Werte zu verarbeiten und dann diese temporäre Tabelle zu verwenden, um die endgültige Ausgabe zu erhalten. Es wäre sehr, sehr wahrscheinlich schneller als das Recordset gehen oder eine VBA-Funktion verwenden. –

0

Rico, jeder hat Recht mit der UDF, um es mit Abfragen zu tun wäre wahrscheinlich langsamer. Fügen Sie diese Funktion einem Modul hinzu und sehen Sie, wie schnell es ist. Ich habe es in wenigen Sekunden auf 500K-Platten gespielt.

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 

Ihre Abfrage könnte wie folgt aussehen:

SELECT Antecedent, Consequent 
FROM Table1 
WHERE IsWithin([Antecedent],[Consequent])=False; 
Verwandte Themen