SQL Left Join (condizione di join multiplo)
-
27-10-2019 - |
Domanda
Ho due tabelle derivate denominate Check in e Check Out
Check-in
CheckDate CheckIn
---------- ---------
08/02/2011 10:10:03
08/02/2011 15:57:16
07/19/2011 13:58:52
07/19/2011 16:50:55
07/26/2011 15:11:24
06/21/2011 12:36:47
08/16/2011 14:49:36
08/09/2011 13:52:10
08/09/2011 16:54:51
08/23/2011 15:48:58
09/06/2011 15:23:00
09/13/2011 10:09:27
09/13/2011 10:40:14
09/13/2011 11:43:14
09/13/2011 11:59:32
09/13/2011 17:05:24
09/20/2011 11:03:42
09/20/2011 12:08:50
09/20/2011 15:21:06
09/20/2011 15:34:29
09/27/2011 11:34:06
10/04/2011 11:37:59
10/04/2011 15:24:04
10/04/2011 16:57:44
10/11/2011 18:19:33
Check-out
CheckDate CheckOut
---------- ---------
08/02/2011 13:29:40
08/02/2011 17:02:25
07/12/2011 17:06:06
07/19/2011 16:40:15
07/19/2011 17:07:35
07/26/2011 14:48:10
07/26/2011 17:27:08
05/31/2011 17:01:39
06/07/2011 17:04:29
06/14/2011 17:08:50
06/21/2011 17:03:46
06/28/2011 17:10:45
07/05/2011 17:02:48
08/16/2011 13:37:36
08/16/2011 17:06:34
08/09/2011 12:00:29
08/09/2011 13:29:36
08/09/2011 14:36:09
08/09/2011 17:00:38
08/23/2011 13:37:11
08/23/2011 17:01:37
09/06/2011 17:00:09
09/13/2011 10:11:50
09/13/2011 11:22:02
09/13/2011 11:47:35
09/13/2011 14:13:36
09/13/2011 14:14:25
09/13/2011 17:08:43
09/20/2011 09:54:55
09/20/2011 11:55:31
09/20/2011 11:55:36
09/20/2011 13:35:16
09/20/2011 15:26:02
09/20/2011 16:33:21
09/20/2011 17:07:52
09/27/2011 11:12:38
10/04/2011 13:26:31
10/04/2011 16:32:56
10/04/2011 17:02:35
10/11/2011 18:25:32
Voglio accoppiare i check in con i check out a condizione che entrambi i log siano nella stessa data e i valori di check out non possono essere precedenti ai check in, quindi ho trovato questa domanda
SELECT A.ChkDt
AS CheckDate,
B.CheckIn,
MIN(A.ChkTm)
AS CheckOut
FROM #tempAttLogs
AS A LEFT JOIN
(SELECT ChkDt
AS CheckDate,
MIN(ChkTm)
AS CheckIn
FROM #tempAttLogs
WHERE ChkTp = 'I'
GROUP BY ChkDt) B
ON A.ChkDt = B.CheckDate
WHERE ChkTp = 'O' AND
A.ChkTm > B.CheckIn
GROUP BY A.ChkDt, B.CheckIn
Con un set di risultati di
CheckDate CheckIn CheckOut
---------- --------- ---------
06/21/2011 12:36:47 17:03:46
07/19/2011 13:58:52 16:40:15
07/26/2011 15:11:24 17:27:08
08/02/2011 10:10:03 13:29:40
08/09/2011 13:52:10 14:36:09
08/16/2011 14:49:36 17:06:34
08/23/2011 15:48:58 17:01:37
09/06/2011 15:23:00 17:00:09
09/13/2011 10:09:27 10:11:50
09/20/2011 11:03:42 11:55:31
10/04/2011 11:37:59 13:26:31
10/11/2011 18:19:33 18:25:32
Il fatto è che voglio includere anche i log senza coppie corrispondenti.Come può essere possibile?
<”EDIT
Il mio set di risultati previsto deve includere log come questo
CheckDate CheckIn CheckOut
---------- --------- ---------
05/23/2011 NULL 17:04:27
Soluzione
Puoi spostare qualsiasi predicato che fa riferimento alla tabella di destra nella clausola ON
invece di WHERE
per evitare di trasformare il JOIN
in un INNER JOIN
ad es.
ON A.ChkDt = B.CheckDate AND
A.ChkTm > B.CheckIn
WHERE ChkTp = 'O'
Invece di
ON A.ChkDt = B.CheckDate
WHERE ChkTp = 'O' AND
A.ChkTm > B.CheckIn
Altri suggerimenti
Includere i valori nulli nella clausola WHERE Es:
WHERE( ChkTp = 'O' AND
A.ChkTm > B.CheckIn) OR B.CheckDate IS NULL
Questo potrebbe essere utile (non testato) per risolvere il tuo problema sebbene sia leggermente tangente alla tua domanda.
select
Checkdate, CheckIn as CheckTime, 'I' as CheckAction
from CheckIns
union all
select
Checkdate, CheckOut as CheckTime, 'O' as CheckAction
from CheckOuts
order by 1,2