2014-10-07 4 views
1

Мне нужно создать запрос, чтобы получить всю посещаемость сотрудника в течение срока. Но время из разных таблиц. Мне нужно создать запрос, подобный приведенному ниже, но я не знаю, как это сделать?Использование BETWEEN с подзапросом postgres

SELECT * FROM attendance WHERE employeeid = 25 AND attendance_date BETWEEN (SELECT bill_fromdate,bill_todate FROM bill WHERE bill_id = 21487)

Я использую PostgreSQL 8.4.

ответ

3

Вы можете использовать join вместо подзапроса:

SELECT * 
FROM attendance a 
JOIN bill b ON 
     a.attendance_date BETWEEN b.bill_fromdate AND b.bill_todate 
WHERE a.employeeid = 25 AND AND b.bill_id = 21487 
+0

JOIN не обязательно будет возвращать ту же информацию, что и решение подзапроса. –

+0

@a_horse_with_no_name Извините, я не понял, что вы сказали. –

+0

@Mureinik есть около 30 тыс. Векселей и около 1000 тыс. Посещений. Соединяется, создавая любые проблемы с производительностью. –

2

либо использовать JOIN (как в ответ Mureinik), или использовать суб-выбора с exists условием:

SELECT a.* 
FROM attendance a 
WHERE a.employeeid = 25 
    AND exists (select 1 
       from bill b 
       where b.bill_id = 21487 
       and a.attendance_date BETWEEN b.bill_fromdate AND b.bill_todate) 

Учитывая ваш примерный запрос, скорее всего, нет никакой разницы между использованием соединения или подвыбором.

Но они имеют разные значения и соединение могут возвращать другой результат (т. Е. Больше строк), чем подвыбор (но в этом случае я сомневаюсь).

Смежные вопросы