如何组合这两个 MS Access 查询?
How can I combine these 2 MS Access queries?
SELECT
USERINFO.Name, USERINFO.SSN, USERINFO.Badgenumber,
FORMAT(CHECKINOUT.CHECKTIME,"yyyy") AS [YEAR],
FORMAT(CHECKINOUT.CHECKTIME,"mmmm") AS [MONTH],
FORMAT(CHECKINOUT.CHECKTIME,"dd") AS DAYS,
FORMAT((Min(CHECKINOUT.CHECKTIME)),"hh:mm am/pm") AS TIMEIN,
FORMAT(CHECKINOUT.CHECKTIME,"AMPM") AS [AM/PM], CHECKINOUT.CHECKTYPE
FROM
CHECKINOUT
INNER JOIN
USERINFO ON CHECKINOUT.USERID = USERINFO.USERID
WHERE
(CHECKINOUT.CHECKTIME >= DATEVALUE(PERIOD_START) AND
CHECKINOUT.CHECKTIME < DATEADD("d", 1, PERIOD_END) AND
USERINFO.Name = Insert_Name) AND
CHECKINOUT.CHECKTYPE = "I"
GROUP BY
CHECKINOUT.USERID, USERINFO.Name, USERINFO.SSN,
DateValue(CHECKINOUT.CHECKTIME), FORMAT(CHECKINOUT.CHECKTIME,"AMPM"),
USERINFO.Badgenumber, FORMAT(CHECKINOUT.CHECKTIME,"mmmm"),
FORMAT(CHECKINOUT.CHECKTIME,"yyyy"), FORMAT(CHECKINOUT.CHECKTIME,"dd"),
CHECKINOUT.CHECKTYPE
HAVING
(((USERINFO.Badgenumber) < "8000"))
ORDER BY
USERINFO.Name, Min(CHECKINOUT.CHECKTIME);
此查询的时间是
SELECT
USERINFO.Name, USERINFO.SSN, USERINFO.Badgenumber,
FORMAT(CHECKINOUT.CHECKTIME,"yyyy") AS [YEAR],
FORMAT(CHECKINOUT.CHECKTIME,"mmmm") AS [MONTH],
FORMAT(CHECKINOUT.CHECKTIME,"dd") AS DAYS,
FORMAT((Max(CHECKINOUT.CHECKTIME)),"hh:mm am/pm") AS TIMEOUT,
FORMAT(CHECKINOUT.CHECKTIME,"AMPM") AS [AM/PM],
CHECKINOUT.CHECKTYPE
FROM
CHECKINOUT
INNER JOIN
USERINFO ON CHECKINOUT.USERID = USERINFO.USERID
WHERE
(CHECKINOUT.CHECKTIME >= DATEVALUE(PERIOD_START) AND
CHECKINOUT.CHECKTIME < DATEADD("d", 1, PERIOD_END) AND
USERINFO.Name = Insert_Name) AND
CHECKINOUT.CHECKTYPE = "O"
GROUP BY
CHECKINOUT.USERID, USERINFO.Name, USERINFO.SSN,
DateValue(CHECKINOUT.CHECKTIME), FORMAT(CHECKINOUT.CHECKTIME,"AMPM"),
USERINFO.Badgenumber, FORMAT(CHECKINOUT.CHECKTIME,"mmmm"),
FORMAT(CHECKINOUT.CHECKTIME,"yyyy"), FORMAT(CHECKINOUT.CHECKTIME,"dd"),
CHECKINOUT.CHECKTYPE
HAVING
(((USERINFO.Badgenumber) < "8000"))
ORDER BY
USERINFO.Name, Min(CHECKINOUT.CHECKTIME);
此查询超时,
如何将这 2 个查询组合在一起?
除了各自的 WHERE
子句中的单个条件外,这些查询看起来是相同的。第一个查询是这样的:
CHECKINOUT.CHECKTYPE = "I"
而第二个有这个
CHECKINOUT.CHECKTYPE = "O"
我觉得你可以把这两个条件结合起来,如下:
WHERE ... AND CHECKINOUT.CHECKTYPE IN ("I", "O")
完整查询:
SELECT USERINFO.Name,
USERINFO.SSN,
USERINFO.Badgenumber,
FORMAT(CHECKINOUT.CHECKTIME,"yyyy") AS [YEAR],
FORMAT(CHECKINOUT.CHECKTIME,"mmmm") AS [MONTH],
FORMAT(CHECKINOUT.CHECKTIME,"dd") AS DAYS,
FORMAT((MIN(CHECKINOUT.CHECKTIME)), "hh:mm am/pm") AS TIMEIN,
FORMAT(CHECKINOUT.CHECKTIME,"AMPM") AS [AM/PM],
CHECKINOUT.CHECKTYPE
FROM CHECKINOUT
INNER JOIN USERINFO
ON CHECKINOUT.USERID = USERINFO.USERID
WHERE CHECKINOUT.CHECKTIME >= DATEVALUE(PERIOD_START) AND
CHECKINOUT.CHECKTIME < DATEADD("d", 1, PERIOD_END) AND
USERINFO.Name = Insert_Name AND
CHECKINOUT.CHECKTYPE IN ("I", "O") -- here is the change
GROUP BY CHECKINOUT.USERID,
USERINFO.Name,
USERINFO.SSN,
DateValue(CHECKINOUT.CHECKTIME),
FORMAT(CHECKINOUT.CHECKTIME,"AMPM"),
USERINFO.Badgenumber,
FORMAT(CHECKINOUT.CHECKTIME,"mmmm"),
FORMAT(CHECKINOUT.CHECKTIME,"yyyy"),
FORMAT(CHECKINOUT.CHECKTIME,"dd"),
CHECKINOUT.CHECKTYPE
HAVING USERINFO.Badgenumber < "8000"
ORDER BY USERINFO.Name,
MIN(CHECKINOUT.CHECKTIME);
出于参考目的,如果两个查询的逻辑差异很大,但是两个查询在 SELECT
子句中具有相同的结构,我们可以对两个查询执行 UNION
。
SELECT
USERINFO.Name, USERINFO.SSN, USERINFO.Badgenumber,
FORMAT(CHECKINOUT.CHECKTIME,"yyyy") AS [YEAR],
FORMAT(CHECKINOUT.CHECKTIME,"mmmm") AS [MONTH],
FORMAT(CHECKINOUT.CHECKTIME,"dd") AS DAYS,
FORMAT((Min(CHECKINOUT.CHECKTIME)),"hh:mm am/pm") AS TIMEIN,
FORMAT(CHECKINOUT.CHECKTIME,"AMPM") AS [AM/PM], CHECKINOUT.CHECKTYPE
FROM
CHECKINOUT
INNER JOIN
USERINFO ON CHECKINOUT.USERID = USERINFO.USERID
WHERE
(CHECKINOUT.CHECKTIME >= DATEVALUE(PERIOD_START) AND
CHECKINOUT.CHECKTIME < DATEADD("d", 1, PERIOD_END) AND
USERINFO.Name = Insert_Name) AND
CHECKINOUT.CHECKTYPE = "I"
GROUP BY
CHECKINOUT.USERID, USERINFO.Name, USERINFO.SSN,
DateValue(CHECKINOUT.CHECKTIME), FORMAT(CHECKINOUT.CHECKTIME,"AMPM"),
USERINFO.Badgenumber, FORMAT(CHECKINOUT.CHECKTIME,"mmmm"),
FORMAT(CHECKINOUT.CHECKTIME,"yyyy"), FORMAT(CHECKINOUT.CHECKTIME,"dd"),
CHECKINOUT.CHECKTYPE
HAVING
(((USERINFO.Badgenumber) < "8000"))
ORDER BY
USERINFO.Name, Min(CHECKINOUT.CHECKTIME);
此查询的时间是
SELECT
USERINFO.Name, USERINFO.SSN, USERINFO.Badgenumber,
FORMAT(CHECKINOUT.CHECKTIME,"yyyy") AS [YEAR],
FORMAT(CHECKINOUT.CHECKTIME,"mmmm") AS [MONTH],
FORMAT(CHECKINOUT.CHECKTIME,"dd") AS DAYS,
FORMAT((Max(CHECKINOUT.CHECKTIME)),"hh:mm am/pm") AS TIMEOUT,
FORMAT(CHECKINOUT.CHECKTIME,"AMPM") AS [AM/PM],
CHECKINOUT.CHECKTYPE
FROM
CHECKINOUT
INNER JOIN
USERINFO ON CHECKINOUT.USERID = USERINFO.USERID
WHERE
(CHECKINOUT.CHECKTIME >= DATEVALUE(PERIOD_START) AND
CHECKINOUT.CHECKTIME < DATEADD("d", 1, PERIOD_END) AND
USERINFO.Name = Insert_Name) AND
CHECKINOUT.CHECKTYPE = "O"
GROUP BY
CHECKINOUT.USERID, USERINFO.Name, USERINFO.SSN,
DateValue(CHECKINOUT.CHECKTIME), FORMAT(CHECKINOUT.CHECKTIME,"AMPM"),
USERINFO.Badgenumber, FORMAT(CHECKINOUT.CHECKTIME,"mmmm"),
FORMAT(CHECKINOUT.CHECKTIME,"yyyy"), FORMAT(CHECKINOUT.CHECKTIME,"dd"),
CHECKINOUT.CHECKTYPE
HAVING
(((USERINFO.Badgenumber) < "8000"))
ORDER BY
USERINFO.Name, Min(CHECKINOUT.CHECKTIME);
此查询超时,
如何将这 2 个查询组合在一起?
除了各自的 WHERE
子句中的单个条件外,这些查询看起来是相同的。第一个查询是这样的:
CHECKINOUT.CHECKTYPE = "I"
而第二个有这个
CHECKINOUT.CHECKTYPE = "O"
我觉得你可以把这两个条件结合起来,如下:
WHERE ... AND CHECKINOUT.CHECKTYPE IN ("I", "O")
完整查询:
SELECT USERINFO.Name,
USERINFO.SSN,
USERINFO.Badgenumber,
FORMAT(CHECKINOUT.CHECKTIME,"yyyy") AS [YEAR],
FORMAT(CHECKINOUT.CHECKTIME,"mmmm") AS [MONTH],
FORMAT(CHECKINOUT.CHECKTIME,"dd") AS DAYS,
FORMAT((MIN(CHECKINOUT.CHECKTIME)), "hh:mm am/pm") AS TIMEIN,
FORMAT(CHECKINOUT.CHECKTIME,"AMPM") AS [AM/PM],
CHECKINOUT.CHECKTYPE
FROM CHECKINOUT
INNER JOIN USERINFO
ON CHECKINOUT.USERID = USERINFO.USERID
WHERE CHECKINOUT.CHECKTIME >= DATEVALUE(PERIOD_START) AND
CHECKINOUT.CHECKTIME < DATEADD("d", 1, PERIOD_END) AND
USERINFO.Name = Insert_Name AND
CHECKINOUT.CHECKTYPE IN ("I", "O") -- here is the change
GROUP BY CHECKINOUT.USERID,
USERINFO.Name,
USERINFO.SSN,
DateValue(CHECKINOUT.CHECKTIME),
FORMAT(CHECKINOUT.CHECKTIME,"AMPM"),
USERINFO.Badgenumber,
FORMAT(CHECKINOUT.CHECKTIME,"mmmm"),
FORMAT(CHECKINOUT.CHECKTIME,"yyyy"),
FORMAT(CHECKINOUT.CHECKTIME,"dd"),
CHECKINOUT.CHECKTYPE
HAVING USERINFO.Badgenumber < "8000"
ORDER BY USERINFO.Name,
MIN(CHECKINOUT.CHECKTIME);
出于参考目的,如果两个查询的逻辑差异很大,但是两个查询在 SELECT
子句中具有相同的结构,我们可以对两个查询执行 UNION
。