2011-01-03 10 views
0

Ich habe folgende Daten auf Datenbank.SQL zum Lesen von Datensätzen zwischen

ID |SOURCE|DATETIME   | URL       | TRANSACTION_ID 
1001|254|2011-01-01 12:00:00|http://www.domain.com/page1.html|NULL 
1001|254|2011-01-01 12:00:00|http://www.domain.com/page3.html|NULL 
1305|333|2011-01-01 12:00:00|http://www.domainx.com/page5.html|NULL 
1432|777|2011-01-01 12:00:00|http://www.domainx.com/page5.html|NULL 
1001|254|2011-01-01 12:00:00|http://www.domain.com/page5.html|NULL 
1001|254|2011-01-01 12:00:00|http://www.domain.com/page2.html|NULL 
1001|254|2011-01-01 12:00:00|http://www.domain.com/page1.html|457899447 
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page1.html|NULL 
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page3.html|NULL 
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page5.html|NULL 
1005|124|2011-01-01 12:00:00|http://www.domainx.com/page5.html|NULL 
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page2.html|NULL 
1005|214|2011-01-01 12:00:00|http://www.domainx.com/page5.html|NULL 
1005|219|2011-01-01 12:00:00|http://www.domainx.com/page5.html|NULL 
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page1.html|1235642321 

Was ich tun möchte, basiert auf der Transaktions-ID und SOURCE bekommen die Zeilen dazwischen. Also Wenn Sie wollen Datensätze nach der letzten Transaktion (457899447) und vor der neuen Transaktion (1235642321) mit Beispiel-Abfrage wie

SELECT * FROM table WHERE SOURCE=254 && TRANSACTION_ID=1235642321 

Ich sollte das Ergebnis unter

1003|254|2011-01-01 12:00:00|http://www.domainb.com/page1.html|NULL 
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page3.html|NULL 
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page5.html|NULL 
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page2.html|NULL 
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page1.html|1235642321 

bekommen Wie kann ich das acomplish?

+1

Ich glaube nicht, dass SQL Server einen '&&' Operator hat. – Oded

+0

Mysql hat :) es war Beispiel Kumpel. – Shift

+0

Sie haben die Frage tsql markiert. Das ist der SQL Server-Dialekt von SQL. Wenn Sie MySQL verwenden, markieren Sie Ihre Frage MySQL. – Oded

Antwort

0

Entweder Sie verwenden

WHERE ... AND (TRANSACTION_ID=1235642321 OR TRANSACTION_ID IS NULL)

oder:

WHERE ... AND COALESCE(TRANSACTION_ID,12345642321)=1235642321

+0

Ich muss? dies auch ohne Angabe einer Quelle oder TRANSACTION_ID. wie Gruppe von Sache. SO eine Abfrage, die alle Ergebnis wie Beispiel Ausgabe kombiniert oben. – Shift

+1

ich bin nicht sicher, ob ich diese bekommen .. Sie bedeuten eine 'TRANSACTION_ID zwischen 457.899.447 und 1235642321' oder Sie müssen Erkennen Sie die vorherige Transaktion oder ... können Sie Ihre Beispielausgabe ein wenig verbessern? – Vlagged

2

Basierend auf einigen Annahmen soley auf das, was die kleine Stichprobe von Daten wie folgt aussieht:

  • Die "Quelle" zum Filtern ist die gleiche wie für fo und für die TRANSACTION_ID bestanden in
  • Spalte „Id“ ist eine aufsteigende ganze Zahl für alle Einträge in der Tabelle für die Quelle

ich komme mit: (aktualisiert auf der Grundlage neuer Daten)

WITH cteNew (Id, Source) 
    as (-- Get Id and Source of transaction @Transaction_Id 
     select Id, Source 
      from MyTable 
      where Transaction_Id = @TransactionId) 
    SELECT * 
    from Mytable 
     where Source = cteNew.Source -- All entries for this source 
     and Id = cteNew.Id 

ich machte es einen CTE in der Hoffnung, dass die SQL-Optimierer die redundanten Abfragen (Tabellen-Scans) opitimize, aber Sie es in zwei Abfragen mit dem ersten Zuweisung von Id und Quelle zu lokalen Variablen brechen könnten.

(Könnte es nicht kann einige Syntax-Debugging testen, erforderlich sein.)


Herausgegeben, basierend auf Kommentare mit @ Chris Lively:

Wenn es die einfachere Situation ist, dann eine einfache eine solche Unterabfrage sollte funktionieren - und MySQL unterstützt diese, nicht wahr?

SELECT * 
from Mytable 
where Id = (select Id 
       from MyTable 
       where Transaction_Id = @TransactionId) 

Dies setzt (wiederum) voraus, dass Transaction_ID in der Tabelle eindeutig ist.

+0

Ich muss diesen Kumpel testen. Vielen Dank. Ich werde meine Ergebnisse veröffentlichen. – Shift

+1

@Philip: Ich denke du warst nah dran. Überprüfen Sie die Aktualisierungen der Daten. Die ID-Spalte definiert einen bestimmten Satz von Transaktionen. In diesem Fall ID = 1003. Ich habe Ihren CTE so geändert, dass dieser Wert – NotMe

+0

@Chris: True ist, aber wenn ja, dann sieht es so aus, als ob Sie nur alle für diese ID für diese Transaktions-ID auswählen müssen. Vielleicht ist es so einfach? Ich kann es nicht sagen, ohne die Regeln dafür zu kennen, wie Daten in die Tabelle geladen werden. –

Verwandte Themen