Mysql: Wybierz wiersze z tabeli, których nie ma w innej

Jak wybrać wszystkie wiersze w jednej tabeli, które nie pojawiają się na innej?

Table1:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

Table2:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
+-----------+----------+------------+

Przykładowe wyjście dla wierszy w tabeli 1, które nie są w tabeli 2:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

Może coś takiego powinno zadziałać:

SELECT * FROM Table1 WHERE * NOT IN (SELECT * FROM Table2)
Author: Christopher Rapcewicz, 2012-08-02

8 answers

Jeśli masz 300 kolumn, jak wspomniałeś w innym komentarzu ,i chcesz porównać wszystkie kolumny (zakładając, że wszystkie kolumny mają tę samą nazwę), możesz użyć NATURAL LEFT JOIN, aby domyślnie połączyć wszystkie pasujące nazwy kolumn między dwiema tabelami, dzięki czemu nie musisz żmudnie wpisywać wszystkich warunków łączenia ręcznie:

SELECT            a.*
FROM              tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE             b.FirstName IS NULL
 76
Author: Zane Bien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-01 22:12:50

Musisz wykonać podwybór na podstawie nazwy kolumny, a nie *.

Na przykład, jeśli masz pole id wspólne dla obu tabel, możesz to zrobić:

SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)

Więcej przykładów można znaleźć w składni subquery MySQL .

 146
Author: Stennie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-01 21:12:02

Standardowe łącze lewe może rozwiązać problem i, Jeśli pola na łączu są indeksowane,
powinno być również szybsze

SELECT *
FROM Table1 as t1 LEFT JOIN Table2 as t2 
ON t1.FirstName = t2.FirstName AND t1.LastName=t2.LastName
WHERE t2.BirthDate Is Null
 30
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-01 21:28:33
SELECT *
FROM Table1 AS a
WHERE NOT EXISTS (
  SELECT *
  FROM Table2 AS b 
  WHERE a.FirstName=b.FirstName AND a.LastName=b.Last_Name
)

EXISTS pomoże Ci...

 27
Author: Ruzbeh Irani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-20 22:16:59

Try:

SELECT * FROM table1
    LEFT OUTER JOIN table2
    ON table1.FirstName = table2.FirstName and table1.LastName=table2.LastName
    WHERE table2.BirthDate IS NULL
 6
Author: Sachin Pundir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-08 12:21:30

To działało dla mnie w Oracle:

SELECT a.* 
    FROM tbl1 a 
MINUS 
SELECT b.* 
    FROM tbl2 b;
 0
Author: Gennady Sorochan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-07 13:24:27

Spróbuj tego prostego zapytania. Działa idealnie.

select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);
 0
Author: Vijesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-30 16:58:56
SELECT a.* FROM 
FROM tbl_1 a
MINUS
SELECT b.* FROM 
FROM tbl_2 b
 -4
Author: Ingrid R. Forsale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-16 21:52:08