Como hacer izquierda unirse con `donde second_table.key! = 'Value'` si no se registran en secord_table en absoluto

Bloque de Max:

Hay dos mesas con relación uno a uno, y es un legal que la segunda tabla puede tener menos filas que el primero.

Aquí es un código SQL con los datos insertados:

create table data(
    data_id int primary key,
    name text
);

create table data_extra(
    extra_id int references data(data_id) primary key ,
    extra text
);

insert into data values (1, 'n1');
insert into data values (2, 'n2');
insert into data values (3, 'n3');

insert into data_extra values (1, 'e1');
insert into data_extra values (2, 'e2');


select * from data left join data_extra on data_id = extra_id;
--  data_id | name | extra_id | extra
-- ---------+------+----------+-------
--        1 | n1   |        1 | e1
--        2 | n2   |        2 | e2
--        3 | n3   |          |
-- (3 rows)

Necesito hacer una consulta para todos data+ data_extramesas donde adicional = 'E1' Aquí está mi intento:

select * from data left join data_extra on data_id = extra_id
where extra != 'e1';
--  data_id | name | extra_id | extra
-- ---------+------+----------+-------
--        2 | n2   |        2 | e2
-- (1 row)

El problema con esta consulta, que no vuelve data.name = fila 'n3', que no tiene una fila relacionada en data_extra mesa.

¿Cómo puedo solucionarlo, para obtener como resultado data.name = n2 y n3 = data.name.

GMB:

Podrías hacerlo:

select * 
from data d
left join data_extra de on d.data_id = de.extra_id 
where de.extra_id is null or de.extra <> 'e1'

Esto elimina filas que coinciden y cuya extraes igual a 'e1', al tiempo que conserva filas no coincidentes.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=377569&siteId=1
Recomendado
Clasificación