두 테이블을 비교하고 경기를 건너뛰는 방법은 무엇입니까?
저는 사용자라는 테이블을 가지고 있습니다.
이 표에는 각 직원이 가지고 있는 내부 번호, 이름 및 출발 시간이 저장되어 있습니다.
num_html | 이름. | 출발. |
---|---|---|
1001 | 존. | 13:00 |
1002 | 루시아 | 14:00 |
저는 레코드라는 테이블을 가지고 있습니다.
이 표에는 각 직원이 근무지를 떠난 날짜와 시간에 대한 기록이 보관되어 있습니다.
num_html | 날짜. |
---|---|
1001 | 2022-02-01 13:01:00 |
1002 | 2022-02-01 14:01:00 |
1001 | 2022-02-02 12:30:00 |
1002 | 2022-02-02 13:56:00 |
저는 패스라는 테이블을 가지고 있습니다.
다음 표에는 공식 출발 시간 전에 퇴근할 수 있도록 직원에게 부여된 출입증이 기록되어 있습니다.
num_html | 날짜. |
---|---|
1001 | 2022-02-02 |
저는 직원이 특정 달(2월)에 체크아웃 시간 전에 퇴근한 모든 시간을 표시하기 위해 다음 쿼리를 작성했습니다.
SELECT r.num_employee,
u.name,
DAY(r.date) AS day,
CAST(r.date AS time) AS time
FROM users u
LEFT JOIN(SELECT num_employee, date FROM records) r ON r.num_employee = u.num_employee
WHERE date BETWEEN '2022-02-01' AND '2022-02-28'
GROUP BY num_employee, DATE(date)
HAVING time < SUBTIME(u.departure,'0:01')
이 쿼리는 직원 번호, 직원 이름 및 직원이 조기 퇴직한 2월의 날짜를 표시합니다.결과는 다음과 같습니다.
num_html | 이름. | 낮의 |
---|---|---|
1001 | 존. | 2 |
1002 | 루시아 | 2 |
또한 2월에 부여된 패스를 표시하기 위해 다음과 같은 질문이 있습니다.
SELECT p.num_employee,
u.name,
DAY(p.date) AS day
FROM users u
LEFT JOIN(SELECT num_employee, date FROM passes) p ON p.num_employee = u.num_employee
WHERE date BETWEEN '2022-02-01' AND '2022-02-28'
GROUP BY num_employee, DATE(date)
위의 쿼리는 다음 결과를 표시합니다.
num_html | 이름. | 낮의 |
---|---|---|
1001 | 존. | 2 |
제가 찾고 있는 것은 해고 시간 전에 퇴근해서 출입증이 없는 직원들을 데려오는 것입니다.위의 예를 들어보면 존만 출입증이 있으므로 출입증을 소지하지 않고 일찍 떠난 사람들의 결과로 나타나야 할 사람은 루시아입니다.원하는 결과는 다음과 같이 표시됩니다.
num_html | 이름. | 낮의 |
---|---|---|
1002 | 루시아 | 2 |
제가 어떻게 그런 결과를 얻을 수 있을까요?저는 CTE를 지원하지 않는 버전으로 phpMyAdmin의 MariaDB와 함께 작업하고 있습니다.
디슬라이머, 저는 마리아Db를 많이 사용하지 않았습니다.궁극적으로 필요한 것은 추가 외부 조인입니다.passes
직원 번호 및 날짜에 표시됩니다.그런 다음 패스 레코드가 일치하는 행을 제외합니다.WHERE p.date IS NULL
모든 그룹화 및 기타 필터가 없으면 기본 쿼리는 다음과 같습니다.
SELECT *
FROM users u
INNER JOIN records r ON r.num_employee = u.num_employee
LEFT JOIN passes p ON p.num_employee = u.num_employee
AND p.date = DATE(r.Date)
WHERE p.date IS NULL
이 결과는 다음과 같습니다.
num_build | 이름 | 출발 | num_build | 날짜 | num_build | 날짜-----------: | :---- | :-------- | -----------: | :------------------ | -----------: | :---1001 | 존 | 13:00:00 | 1001 | 2022-02-01 13:01:00 | null | null1002 | 루시아 | 14:00:00 | 1002 | 2022-02-01 14:01:00 | null | null1002 | 루시아 | 14:00:00 | 1002 | 2022-02-02 13:56:00 | null | null
그런 다음 그룹화 및 날짜 필터를 다시 추가합니다.
SELECT r.num_employee,
u.name,
u.departure,
DAY(r.date) AS day,
CAST(r.date AS time) AS time
FROM users u
INNER JOIN records r ON r.num_employee = u.num_employee
LEFT JOIN passes p ON p.num_employee = u.num_employee
AND p.date = DATE(r.Date)
WHERE r.date >= '2022-02-01'
AND r.date < '2022-03-01'
AND p.date IS NULL
GROUP BY r.num_employee, DATE(r.date)
HAVING time < SUBTIME(departure,'0:01')
결과:
num_num | 이름 | 출발 | 일 | 시간-----------: | :---- | :-------- | --: | :-------1002 | 루시아 | 14:00:00 | 2 | 13:56:00
원래 쿼리에 대한 몇 가지 참고 사항:
LEFT JOIN(num_join, date from records) r r.num_join = u.num_join(여기서 날짜는 '2021-02-01'과 '2021-02-28' 사이)
JOIN이 필요한 것은 , OUTER JOIN에 필터링이 필요하다는 바랍니다.records.date
WHERE 절은 암시적으로 JOIN을 INER JOIN으로 변환합니다.단지 주의할 점은...
날짜는 '2022-02-01'과 '2022-02-28' 사이입니다.
ㅠㅠdate
날짜와 시간을 모두 포함하며, 해당 조항은 2022년 2월 28일에 대부분의 항목을 제외합니다.하세요.where date >= StartDateAtMidnight and < EndDateAtMidnight + 1 Day
.
db<>여기로 이동
언급URL : https://stackoverflow.com/questions/71388124/how-to-compare-two-tables-and-skip-matches
'programing' 카테고리의 다른 글
Oracle에서 보기를 만드는 데 사용되는 SQL을 검색하는 방법은 무엇입니까? (0) | 2023.06.15 |
---|---|
원격 호스트가 연결을 닫았습니다.오류 코드는 0x800704입니다.CD (0) | 2023.06.15 |
Python - Excel 파일의 열 너비를 자동으로 조정합니다. (0) | 2023.06.15 |
근거리 및 원거리 포인터 (0) | 2023.06.15 |
시스템JS와 함께 TypeScript에서 momentjs를 어떻게 사용합니까? (0) | 2023.06.15 |