2017-06-05 3 views
0

Ich braucheFinding Kreuzung von zwei Auswahlabfrage

Kreuzung zwischen den folgenden Abfragen in MYSQL finden
SELECT * 
FROM project.backup_table 
where project.backup_table.date <= (SELECT date FROM project.main_inout_table ORDER BY date desc LIMIT 1) 
    and project.backup_table.date >= (SELECT date FROM project.main_inout_table ORDER BY date asc LIMIT 1) 

SELECT * 
FROM project.backup_table 
WHERE concat(empid,date) not IN (SELECT concat(empid,date) FROM project.main_inout_table 

Die Tische sind:

maintable

backuptable

Mein atttempt :

SELECT * FROM project.backup_table 
where project.backup_table.date <= (SELECT date FROM project.main_inout_table 
            ORDER BY date desc LIMIT 1) and project.backup_table.date >= (SELECT date FROM project.main_inout_table 
                     ORDER BY date asc LIMIT 1) and exists (SELECT * FROM project.backup_table 
                     WHERE concat(empid,date) not IN (SELECT concat(empid,date) 
                     FROM project.main_inout_table)); 

Problem: die Details der tid 4 vorhanden ist, sollte es durch die zweite Auswahlabfrage herausfiltern nicht werden?

+0

Ordentlich! Aber wir können Ihnen nicht helfen, wenn Sie uns nicht sagen, welche Felder Sie schneiden müssen. Hast du in eine 'JOIN' geschaut? –

+0

Einfach UND die zwei WHERE-Klauseln. – jarlh

+0

Ich muss einfach die Schnittmenge dieser Abfragen finden @JacobH –

Antwort

0

Der Schnittpunkt wäre die Zeilen, die beide Bedingungen erfüllen. Also, bringen Sie nur die Bedingungen zusammen:

SELECT bt.* 
FROM project.backup_table bt 
WHERE bt.date <= (SELECT MAX(date) FROM project.main_inout_table mit) AND 
     bt.date >= (SELECT MIN(date) FROM project.main_inout_table mit) AND 
     NOT EXISTS (SELECT 1 
        FROM project.main_inout_table mit 
        WHERE mit.empid = bt.empid AND mit.date = bt.date 
       ); 

Beachten Sie folgende Änderungen:

  • Die Tabellen sind angegeben Aliase, die Abkürzungen für die Tabellennamen sind.
  • Die Spalten sind alle mit den Tabellenaliasnamen qualifiziert. Die ersten zwei Unterabfragen verwenden einfach MIN() und MAX(). Diese könnten zu einer Unterabfrage oder einem Join kombiniert werden, dies folgt jedoch Ihrer ursprünglichen Formulierung. Die letzte Unterabfrage verwendet EXISTS statt CONCAT(). Eigentlich könnte dies auch IN mit Tupeln verwenden (etwas, das MySQL unterstützt, aber nicht alle Datenbanken).
+0

Ich habe Probleme mit der zweiten Auswahl Ihrer Antwort scheint es nicht zu funktionieren als die zweite Abfrage meiner Frage –

+0

SELECT * FROM project.backup_table wo project.backup_table .date <= (SELECT Datum FROM project.main_inout_table ORDER BY Datum desc LIMIT 1) und project.backup_table.date> = (SELECT Datum FROM project.main_inout_table ORDER BY Datum asc LIMIT 1) und existiert (SELECT * FROM project.backup_table WHERE concat (empid, date) nicht IN (SELECT concat (empid, Datum) FROM project.main_inout_table)); –

+0

Ich habe versucht, die obige Abfrage, aber die Kreuzung Teil funktioniert nicht können Sie überprüfen, was ist damit? –

Verwandte Themen