Примерно так:
SELECT
a.a,
COALESCE(b.b, -1) as b
FROM
a LEFT JOIN B ON a.id = b.aid
Предположим, у нас есть таблицы:
A.id, A.a
1, 'hello'
2, 'goodbye'
3, 'what'
B.aid, b.b
1, 1
2, null
Когда мы соединяем их с левым соединением, мы получим:
A.id, a.a, B.aid, b.b
1, 'hello', 1, 1
2, 'goodbye', 2, null --b.b is null because the row value is null
3, 'what', null, null --b.b is null because there is no row, all b columns are null
COALESCE просматривает аргументы слева направо в порядке, возвращая первый ненулевой.Если строка в b не существует или существует, но bb в таблице равно NULL, COALESCE превратит ее в -1:
A.id, a.a, B.aid, b.b
1, 'hello', 1, 1
2, 'goodbye', 2, -1 --b.b is -1 because COALESCE found -1 as the first non null value
3, 'what', null, -1 --b.b is -1 because COALESCE found -1 as the first non null value
Если вы хотите использовать 0, если bbnull, но -1, если bb не существует, вам нужно CASE WHEN, используя что-то со значением:
SELECT
a.a,
CASE WHEN b.aid IS NULL THEN -1 ELSE COALESCE(b.b, 0) END as b
FROM
a LEFT JOIN B ON a.id = b.aid
Здесь мы проверяем один из столбцов, используемых в соединении, b.aid
.Если это значение равно нулю, мы знаем, что соединение не удалось, и в B нет строки для этой строки в A, поэтому мы можем CASE WHEN
проверить b.aid на наличие нуля, и если это так, то положить -1 в качестве нашего "-1 означаетни одна строка не была в b ", иначе мы можем COALESCE, чтобы превратить bb в 0, если оно равно нулю.Это дает результат как:
A.id, a.a, B.aid, b.b
1, 'hello', 1, 1
2, 'goodbye', 2, 0 --b.b is 0 because CASE WHEN's ELSE block was used, and COALESCE found 0 as the first non null value
3, 'what', null, -1 --b.b is -1 because CASE WHEN's WHEN block fired, because b.aid was null, and CASE WHEN provided -1 as the value