我一直试图想出这个问题一段时间,但似乎没有什么对我有用,也许一些帮助会帮助我更好地理解它。我正在加入多个表,但只希望与ID号相关联的最大日期。可能有多个日期与ID号相关联。如果我取出MAX(日期)片段,它将运行但返回多个日期值。我不希望MAX(Date)在初始选择中,而只在WHERE子句中。这是我的疑问:
SELECT DISTINCT A.ID , C.Date
FROM IDTable A
INNER JOIN AccountTable B
ON B.AccountID = A.AccountID
FULL OUTER JOIN Updates U
ON U.ID = A.ID
FULL OUTER JOIN Update2 C
ON C.AccountID = B.AccountID
INNER JOIN UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete','Open')
--Need help here to only return MAX date value:
AND C.Date=(SELECT MAX(C.Date) FROM Update2)
ORDER BY A.ID
答案 0 :(得分:3)
如果您不想在初始选择中使用MAX(日期),那么这将有效:
SELECT DISTINCT A.ID , C.Date
FROM IDTable A
INNER JOIN AccountTable B
ON B.AccountID = A.AccountID
FULL OUTER JOIN Updates U
ON U.ID = A.ID
FULL OUTER JOIN Update2 C
ON C.AccountID = B.AccountID
INNER JOIN UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete','Open')
AND C.Date=
(SELECT MAX(C2.Date)
FROM Update2 C2
WHERE C2.AccountID = C.AccountID)
ORDER BY A.ID
答案 1 :(得分:0)
我想你只想要聚合:
SELECT A.ID, MAX(C.Date)
FROM IDTable A INNER JOIN
AccountTable B
ON B.AccountID = A.AccountID FULL OUTER JOIN
Updates U
ON U.ID = A.ID FULL OUTER JOIN
Update2 C
ON C.AccountID = B.AccountID INNER JOIN
UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete', 'Open')
GROUP BY A.ID;
我不知道您为什么要使用FULL OUTER JOIN
,更不用说为什么要将它们与INNER JOIN
混合使用了。我怀疑你真的想要LEFT JOIN
。
答案 2 :(得分:0)
在SQL Server中,使用ROWNUMBER ..
;with cte
as
(
SELECT A.ID , C.Date,row_number() over (partition by a.id order by c.date desc) as rn
FROM IDTable A
INNER JOIN AccountTable B
ON B.AccountID = A.AccountID
FULL OUTER JOIN Updates U
ON U.ID = A.ID
FULL OUTER JOIN Update2 C
ON C.AccountID = B.AccountID
INNER JOIN UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete','Open')
)
select id,date from cte where rn=1
答案 3 :(得分:0)
这是我的看法。对于复杂的查询,总有多种解决方案......
首先,获取每个AccountID的最新日期
try:
doMyFavoriteThing()
except Exception as e:
print str(e)
将其粘贴在子查询中,然后返回表格以获取“最新”条目
select AccountID, max(Date)
from Update2
group by AccountID
将其重新插入原始查询。 使所有子查询保持完全外部连接不同 (为了理解,我也将内连接移动到一起)
select CInner.*, CMax.MaxDate
from Update2 CInner
inner join (-- Max date for every AccountID
select AccountID, max(Date) MaxDate
from Update2
group by AccountID) CMax
on CMax.AccountID = CInner.AccountID
and CMax.MaxDate = CInner.Date
这是我可以去的地方。这里的问题是所有JOIN都将在WHERE子句之前解析,所以在当前形式中,所有那些FULL OUTER JOIN都是没有意义的,因为只包含那些带有max(Date)的结果行。
要提到的是,我发现具有完全外连接的查询很难做到正确。你的查询中有两个这样的事实让我的眼睛流水,而且当他们“分支”你的核心内部联接查询时也是如此。你明确他们需要在那里吗?