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
WHEREfiltro a laJOINcondició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.CustomerSQL 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
EXPLAINque 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.