我正在尝试从表中选择用户可以在3个位置的最早日期。
SELECT RecordID,
(
SELECT MIN(dDate)
FROM (
VALUES(DateSent),
(DiaryDate),
(CareDate)
) As EarliestDate(dDate)
) AS dDate
FROM tblOrderDetails
WHERE Flagged = 0
AND SalesID= '" & UserID & "'
OR Flagged = 0
And RepID= '" & UserID & "'
OR Flagged = 0
AND CareID= '" & UserID & "'"
答案 0 :(得分:2)
如果您想要最早的日期,则需要import re
list=["height = 7.2", "length = 8.32"]
for dim in list:
print(float(re.search('\d+.\d+', dim).group()))
。以下内容适用于某些数据库:
MIN()
(假设这是你想要的逻辑,你的查询中不需要括号。)
SELECT od.RecordID,
(SELECT MIN(EarliestDate.dDate)
FROM (VALUES (od.DateSent), (od.DiaryDate), (od.CareDate)
) As EarliestDate(dDate)
) as dDate
FROM tblOrderDetails od
WHERE (od.Flagged = 0 AND od.SalesID = '" & UserID & "') OR
(od.Flagged = 0 AND od.RepID= '" & UserID & "') OR
(od.Flagged = 0 AND od.CareID= '" & UserID & "'");
子句可以简化为:
WHERE
请注意,WHERE od.Flagged = 0 AND ? IN (od.SalesId, od.RepId, od.CareId)
是参数的占位符。您应该将值作为参数传递,而不是更改查询字符串。
编辑:
这通常是使用?
编写的,正如Noxtrhon所建议的那样。最简单的版本 - 假设没有CASE
值 - 将是:
NULL
如果我没记错的话,SELECT od.RecordID,
(CASE WHEN od.DateSent <= od.DiaryDate and od.DateSent <= od.CareDate
THEN ad.DateSent
WHEN od.DiaryDate <= od.CareDate
THEN od.DiaryDate
ELSE od.CareDate
END) as dDate
FROM tblOrderDetails od
WHERE (od.Flagged = 0 AND od.SalesID = '" & UserID & "') OR
(od.Flagged = 0 AND od.RepID= '" & UserID & "') OR
(od.Flagged = 0 AND od.CareID= '" & UserID & "'");
应该会有稍微好一点的表现,但是比我预期的要好得多。
答案 1 :(得分:1)
我想我明白你在做什么。如果我理解正确,您需要给定RecordID的这三列的最小日期。您可以通过对每列执行UNION ALL每个RecordID来实现。这可以获得MIN(日期)。 AS Justinas指出,你的WHERE中存在问题,必须小心混合AND和OR。
SELECT dT.RecordID, MIN(dT.inDate) AS [EarliestDate]
FROM (
SELECT RecordID, DateSent AS [inDate]
FROM tblOrderDetails
WHERE Flagged = 0
AND ( SalesID= '" & UserID & "'
OR RepID= '" & UserID & "'
OR CareID= '" & UserID & "'
)
UNION ALL
SELECT RecordID, DiaryDate AS [inDate]
FROM tblOrderDetails
WHERE Flagged = 0
AND ( SalesID= '" & UserID & "'
OR RepID= '" & UserID & "'
OR CareID= '" & UserID & "'
)
UNION ALL
SELECT RecordID, CareDate AS [inDate]
FROM tblOrderDetails
WHERE Flagged = 0
AND ( SalesID= '" & UserID & "'
OR RepID= '" & UserID & "'
OR CareID= '" & UserID & "'
)
) AS dT
GROUP BY RecordID
答案 2 :(得分:0)
您可以使用案例陈述来检查案例并决定选择哪一个案例。您已询问最早的日期,但在查询中选择最新日期为Max(...),此查询将返回最早的日期:
SELECT RecordID,
case when DateSent < DiaryDate and DateSent < CareDate then DateSend
when DiaryDate < DateSent and DiaryDate < CareDate then DiaryDate
else CareDate end as dDate
FROM tblOrderDetails
WHERE Flagged = 0 AND
SalesID = '" & UserID & "'OR Flagged = 0 And
RepID = '" & UserID & "' OR Flagged = 0 AND CareID= '" & UserID & "'"