2014-10-07 60 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不一定會返回與子查詢解決方案相同的信息。 – 2014-10-07 06:00:24

+0

@a_horse_with_no_name對不起,我不明白你說了什麼。 – 2014-10-07 06:02:59

+0

@Mureinik大約有30K票據和大約1000K的出勤排。所以加入會產生任何性能問題。 – 2014-10-07 06:06:14

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) 

鑑於你的示例查詢,很可能在使用連接或子選擇之間沒有區別。

但它們有不同的含義,加入可能返回與子選擇不同的結果(即更多的行)(但是在這種情況下我再次懷疑它)。