gpt4 book ai didi

sql - Union Join on postgresql with timestamp column

转载 作者:行者123 更新时间:2023-11-29 14:13:44 25 4
gpt4 key购买 nike

这是一个简单的查询,用于获取学生在特定日期的出勤行。

条件1. 如果学生在该日期有出勤,请获取2.如果不只是检索学生列

我的查询看起来像

Select 0 as attendanceId, 0 as attendanceVersion, '' as inTime,'' as 
outTime,'' as summary,Student.id As
StudentId,Student.firstName,Student.lastName
From Student where student.id not in
( Select student.id From Student join Attendance on ( student.id =
Attendance.studentId )
where attendance.inactiveDate is null and student.inactivedate is
null and
date(attendance.intime) = '2019-06-23' )
and student.inactivedate is null

UNION

Select Attendance.id As AttendanceId,Attendance.version,Attendance.inTime,Attendance.outTime,Attendance.summary,
Student.id As StudentId,Student.firstName,Student.lastName
From Student join Attendance on ( student.id = Attendance.studentId ) where
attendance.inactiveDate is null and student.inactivedate is null and
date(attendance.intime) = '2019-06-23'
order by student.firstname, student.id

我正在尝试做的事情:选择没有出勤的学生行,并与有出勤的学生行合并。

问题:出现以下错误

错误:时区时间戳类型的输入语法无效:“”

SQL 状态:22007

字符:51

我希望 postgres 能够优雅地用空文字替换时区。如何用空字符串替换时区或执行此查询的更好方法

更新:

Select 
Attendance.id As AttendanceId,Attendance.version, Attendance.inTime,Attendance.outTime,Attendance.summary,
Student.id As StudentId,Student.firstName,Student.lastName
From Student left join Attendance on ( student.id = Attendance.studentId )
where student.inactivedate is null and date(attendance.intime) = '2019-06-23'
order by student.firstname, student.id

像内部联接一样生成单行。猜猜是因为我在出勤时加入 Studentid 吗?!

8;1;"2019-06-23 08:55:11+05:30";"";"";16;"AADITH";"PRASAD"

最佳答案

任何时候在 where 子句中使用左联接列,查询都会转换为内部联接:

SELECT * FROM
lef
LEFT JOIN
ri
ON lef.id = ri.id
WHERE ri.column = 'some value'

这个查询将像内部查询一样工作;左连接将为 ri 中没有匹配项的任何行放入空值,但随后 where 子句将取出空值,因为它们中没有一个可以等于“某个值”

Null 永远不等于任何东西

要解决这个问题,请将谓词放在连接条件中:

SELECT * FROM
lef
LEFT JOIN
ri
ON lef.id = ri.id AND ri.column = 'some value'

因此您的查询:

Select 
a.id As AttendanceId,
a.version,
a.inTime,
a.outTime,
a.summary,
s.id As StudentId,
s.firstName,
s.lastName
From
Student s
left join
Attendance a
on
s.id = a.studentId AND
date(a.intime) = '2019-06-23')
WHERE
s.inactivedate is null
ORDER BY s.firstname, s.id

提示:

  • 为您的表格命名。它清理您的代码并允许您多次加入同一个表
  • 缩进你的代码,而不是把它全部塞进一个大块;帮助查看查询的哪些部分去哪里 - 我缩进以便查询中处于同一处理级别的所有内容都处于同一缩进级别。 select、from、on 和 where 等关键字形成 block 标题,然后它们下面的所有内容都缩进
  • 记住始终将在左连接中引用右表(或在右连接中引用左表)的谓词放在 ON 而不是 where 中

关于sql - Union Join on postgresql with timestamp column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56720892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com