Tengo 2 tablas, quiero filtrar la 1 tabla antes de que las 2 tablas se unan.
Tabla de clientes:
╔══════════╦═══════╗
║ Customer ║ State ║
╠══════════╬═══════╣
║ A ║ S ║
║ B ║ V ║
║ C ║ L ║
╚══════════╩═══════╝
Tabla de entrada:
╔══════════╦═══════╦══════════╗
║ Customer ║ Entry ║ Category ║
╠══════════╬═══════╬══════════╣
║ A ║ 5575 ║ D ║
║ A ║ 6532 ║ C ║
║ A ║ 3215 ║ D ║
║ A ║ 5645 ║ M ║
║ B ║ 3331 ║ A ║
║ B ║ 4445 ║ D ║
╚══════════╩═══════╩══════════╝
Quiero unirme a la izquierda para obtener todos los registros de la tabla Cliente independientemente de si hay registros relacionados en la tabla Entrada. Sin embargo, quiero filtrar por categoría D en la tabla de entrada antes de la combinación .
Resultados deseados:
╔══════════╦═══════╦═══════╗
║ Customer ║ State ║ Entry ║
╠══════════╬═══════╬═══════╣
║ A ║ S ║ 5575 ║
║ A ║ S ║ 3215 ║
║ B ║ V ║ 4445 ║
║ C ║ L ║ NULL ║
╚══════════╩═══════╩═══════╝
Si tuviera que hacer la siguiente consulta:
SELECT Customer.Customer, Customer.State, Entry.Entry
FROM Customer
LEFT JOIN Entry
ON Customer.Customer=Entry.Customer
WHERE Entry.Category='D'
Esto filtraría el último registro.
Así que quiero todas las filas de la tabla de la izquierda y unirlas a la tabla de entrada filtrada en la categoría D.
Gracias a cualquier ayuda de antemano !!
sql
join
filter
where-clause
Tom Jenkin
fuente
fuente
Respuestas:
Necesita mover el
WHERE
filtro a laJOIN
condición:SELECT c.Customer, c.State, e.Entry FROM Customer c LEFT JOIN Entry e ON c.Customer=e.Customer AND e.Category='D'
Ver SQL Fiddle con demostración
fuente
También puedes hacer:
SELECT c.Customer, c.State, e.Entry FROM Customer AS c LEFT JOIN (SELECT * FROM Entry WHERE Category='D') AS e ON c.Customer=e.Customer
SQL Fiddle aquí
fuente
O...
SELECT c.Customer, c.State, e.Entry FROM Customer c LEFT JOIN Entry e ON c.Customer=e.Customer WHERE e.Category IS NULL or e.Category='D'
fuente
EXPLAIN
que MySql en realidad lo hace marginalmente mejor en la optimización de esta consulta que la de la respuesta de Taryn, aunque esto ciertamente será más suerte que administración y lo contrario puede ser cierto para otro motor.