【问题标题】:Need help in postgreSQL query在 postgreSQL 查询中需要帮助
【发布时间】:2016-12-15 14:12:32
【问题描述】:

我有两张桌子,table1table2。我写了一些条件如下的查询

Select t2.employee_id,
t2.adddate,
t2.previousaleave
from table2 as t2, table1 as t1
WHERE t1.enddate IS NULL
  OR t1.enddate>t2.adddate
  AND t2.adddate<=now()
  AND t2.leavetype='annualleave' 

如果我运行此程序,则条件不起作用。它正在选择表 t2 的所有 empid。我检查了问题出在 t1.enddate is NULL 条件上。由于enddate 列可以是任何一个,

  • 某个日期
  • null

如果t1.enddate IS NULL 和其他条件成功,我需要获取 empid。这里的休假类型在每个 empid 中都是不同的。 (每个员工只有一排年假)。有没有其他替代方法可以做到这一点。

【问题讨论】:

标签: sql postgresql


【解决方案1】:

如果使用 OR,你总是需要括号

例如:

Select t2.employee_id,t2.adddate,t2.previousaleave 
from table2 as t2
Inner join table1 as t1 ON ............. ?????
WHERE (t1.enddate IS NULL OR t1.enddate>t2.adddate AND t2.adddate<=now())
AND t2.leavetype='annualleave' 

但还请注意,您似乎没有加入表格。始终使用显式 ANSI 连接语法来避免创建表中行的意外笛卡尔积。

如果两个表都存在empid,试试

Select t2.employee_id,t2.adddate,t2.previousaleave 
from table2 as t2
Inner join table1 as t1 ON t2.empid = t1.empid
WHERE (t1.enddate IS NULL OR t1.enddate>t2.adddate AND t2.adddate<=now())
AND t2.leavetype='annualleave' 

【讨论】:

  • 谢谢。我按照你的建议使用了。但是现在即使 t1.enddate 不为 null 并且 t1.enddatet2.adddate,则 empid 在两行。谢谢
  • empid 重复,因为您还没有加入表格。你所做的是乘以行。两个表中是否都存在 empid 列?
【解决方案2】:
SELECT t2.employee_id, t2.adddate, t2.previousaleave
FROM table2 AS t2
INNER JOIN table1 as t1
  ON (
     ( t1.enddate IS NULL OR t1.enddate > t2.adddate )
     AND t2.adddate <= now()
     AND t2.leavetype = 'annualleave'
   )

t2.adddate 是否有可能成为&gt; now()?这似乎很尴尬。

【讨论】:

  • 谢谢。我按照你的建议使用了。但是现在即使 t1.enddate 不为 null 并且 t1.enddatet2.adddate,则 empid 在两行。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多