как я могу сократить запрос postgresql, который использует одно и то же выражение несколько раз? - PullRequest
0 голосов
/ 17 июня 2020

Я хотел бы сократить этот postgresql запрос, чтобы мне не нужно было несколько раз повторять «coalesce (gl.email, m c .email» ...

select r.*,l.*, coalesce(r.email, l.email) 
from righttable r full outer join  lefttable l on r.email=l.email 
where coalesce(r.email, l.email) > 'h' 
order by coalesce(r.email, l.email) limit 10

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Вы можете присоединиться к предложению using:

select *
from righttable r 
full outer join  lefttable l using(email)
where email > 'h' 
order by email 
limit 10

Из документации :

Предложение USING - это сокращение, которое позволяет воспользоваться преимуществом конкретной ситуации c, когда обе стороны соединения используют одно и то же имя для объединяемого столбца (столбцов).

Более того, вывод JOIN USING подавляет избыточные столбцы: есть нет необходимости печатать оба совпадающих столбца, поскольку они должны иметь одинаковые значения. В то время как JOIN ON производит все столбцы из T1, за которыми следуют все столбцы из T2, JOIN USING создает один выходной столбец для каждой из перечисленных пар столбцов (в указанном порядке), за которыми следуют любые оставшиеся столбцы из T1 , за которым следуют любые оставшиеся столбцы из T2.

0 голосов
/ 20 июня 2020

Вот решение, которое сработало для меня ...

Я повторяю этот запрос выбора последовательно.

select r.<field1>, r.<field2>, ..., l.<field1>, l.<field2>,...,coalesce(r.email, l.email) from righttable r full outer join  lefttable l on r.email=l.email where coalesce(r.email, l.email) > <last_read_email_address> order by coalesce(r.email, l.email) limit 10

В каждом последовательном запросе я устанавливаю значение last_read_email_address в последний объединенный адрес электронной почты в предыдущем наборе результатов.

Простой.

...