Mysql MAX(日期)给出的结果为空
我有一张汇率如下的桌子 我使用maxofdate根据货币代码选择所有这些值。但查询结果是空白的Mysql MAX(日期)给出的结果为空,mysql,sql,sql-server,ssms,Mysql,Sql,Sql Server,Ssms,我有一张汇率如下的桌子 我使用maxofdate根据货币代码选择所有这些值。但查询结果是空白的 Select USDAMOUNT * dbo.EXCHANGERATEAMT from dbo.Amount_monthly Left Join dbo.EXCHANGERATE on dbo.Amount_monthly.Currencycode=dbo.EXCHANGERATE.fromcurrencycode WHERE ValidToDateTime = (Select MAX(Va
Select USDAMOUNT * dbo.EXCHANGERATEAMT
from dbo.Amount_monthly
Left Join dbo.EXCHANGERATE on dbo.Amount_monthly.Currencycode=dbo.EXCHANGERATE.fromcurrencycode
WHERE ValidToDateTime = (Select MAX(ValidToDateTime) from dbo.EXCHANGERATE)
AND dbo.EXCHANGERATE.EXCHANGERATETYPECODE = 'DAY'
使用此语句
CONVERT(DATE,ValidToDateTime) = CONVERT(DATE,GETDATE()-1)
而不是子查询正在给我预期的结果。
有人能纠正这一点吗。
提前感谢。尝试删除ValidToDateTime的WHERE子句,并将其包含在加入as和条件中
SELECT USDAMOUNT * dbo.EXCHANGERATEAMT
FROM dbo.Amount_monthly
LEFT JOIN dbo.EXCHANGERATE
ON dbo.Amount_monthly.Currencycode = dbo.EXCHANGERATE.fromcurrencycode
AND ValidToDateTime = (SELECT MAX(ValidToDateTime) --remove WHERE clause
FROM dbo.EXCHANGERATE)
AND dbo.EXCHANGERATE.EXCHANGERATETYPECODE = 'DAY';
尝试删除ValidToDateTime的WHERE子句,并将其包含在JOIN as和条件中
SELECT USDAMOUNT * dbo.EXCHANGERATEAMT
FROM dbo.Amount_monthly
LEFT JOIN dbo.EXCHANGERATE
ON dbo.Amount_monthly.Currencycode = dbo.EXCHANGERATE.fromcurrencycode
AND ValidToDateTime = (SELECT MAX(ValidToDateTime) --remove WHERE clause
FROM dbo.EXCHANGERATE)
AND dbo.EXCHANGERATE.EXCHANGERATETYPECODE = 'DAY';
我稍微整理了一下您的查询:正如其他人提到的,您需要关闭MAX(Date)子查询周围的括号,如果您在WHERE子句中引用一个左连接表,它的行为就像一个内部连接,因此我改为in-internal。您还添加了“dbo”作为字段前缀,但(名称空间)仅作为数据库前缀,而不是字段前缀。我添加了IS NOT NULL检查,只是为了避免SQL发出“NULL值已消除”SQL警告。我在第一个表中使用了别名“am”,在第二个表中使用了别名“er”,这使它更具可读性:
SELECT am.USDAMOUNT * er.EXCHANGERATEAMT
FROM dbo.Amount_monthly am
JOIN dbo.EXCHANGERATE er
ON am.Currencycode = er.fromcurrencycode
WHERE er.ValidToDateTime = (SELECT MAX(ValidToDateTime) FROM dbo.EXCHANGERATE WHERE ValidToDateTime IS NOT NULL)
AND er.EXCHANGERATETYPECODE = 'DAY'
如果你像我一样偏执,你可能还想确保汇率不是零,以避免被零除的错误。我稍微整理了一下你的查询:正如其他人提到的,你需要关闭MAX(Date)子查询的括号,如果你在WHERE子句中引用了一个左连接表,它的行为类似于内部联接,因此我改为内部联接。您还添加了“dbo”作为字段前缀,但(名称空间)仅作为数据库前缀,而不是字段前缀。我添加了IS NOT NULL检查,只是为了避免SQL发出“NULL值已消除”SQL警告。我在第一个表中使用了别名“am”,在第二个表中使用了别名“er”,这使它更具可读性:
SELECT am.USDAMOUNT * er.EXCHANGERATEAMT
FROM dbo.Amount_monthly am
JOIN dbo.EXCHANGERATE er
ON am.Currencycode = er.fromcurrencycode
WHERE er.ValidToDateTime = (SELECT MAX(ValidToDateTime) FROM dbo.EXCHANGERATE WHERE ValidToDateTime IS NOT NULL)
AND er.EXCHANGERATETYPECODE = 'DAY'
如果你像我一样偏执,你可能还想确保汇率不是零,以避免被零除的错误。如果我理解正确,你需要两件事。首先,
max()
的条件需要与外部查询中的条件匹配。第二,如果您真的想要一个左连接
,那么第二个表上的条件需要放在on
子句中
生成的查询如下所示:
Select . . .
from dbo.Amount_monthly am Left Join
dbo.EXCHANGERATE er
on am.Currencycode = er.fromcurrencycode and
er.ValidToDateTime = (Select max(er2.ValidToDateTime)
from dbo.EXCHANGERATE er2
where er2.EXCHANGERATETYPECODE = 'DAY'
) and
er.EXCHANGERATETYPECODE = 'DAY';
我会用窗口函数来写这篇文章,但这是另外一个问题。如果我理解正确,您需要两件事。首先,
max()
的条件需要与外部查询中的条件匹配。第二,如果您真的想要一个左连接
,那么第二个表上的条件需要放在on
子句中
生成的查询如下所示:
Select . . .
from dbo.Amount_monthly am Left Join
dbo.EXCHANGERATE er
on am.Currencycode = er.fromcurrencycode and
er.ValidToDateTime = (Select max(er2.ValidToDateTime)
from dbo.EXCHANGERATE er2
where er2.EXCHANGERATETYPECODE = 'DAY'
) and
er.EXCHANGERATETYPECODE = 'DAY';
我会使用窗口函数来编写,但这是一个单独的问题。子查询没有正确关闭--缺少
)
。实际上,您发布的sql甚至不会编译。确保粘贴正确如果您要立即前往并在where子句中提及表格,那么加入表格就没有意义了;左联接生成的任何空行都将丢失,因为它们在逻辑上不能等同于任何内容(在您的示例中是类型代码)。这两种情况完全不同。一个是与今天的引用进行比较,另一个是表中的值。您使用的是MySQL还是MS SQL Server?该查询不会同时在两个服务器上运行。。。不要标记未涉及的产品。子查询未正确关闭--缺少)
。实际上,您发布的sql甚至不会编译。确保粘贴正确如果您要立即前往并在where子句中提及表格,那么加入表格就没有意义了;左联接生成的任何空行都将丢失,因为它们在逻辑上不能等同于任何内容(在您的示例中是类型代码)。这两种情况完全不同。一个是与今天的引用进行比较,另一个是表中的值。您使用的是MySQL还是MS SQL Server?该查询不会同时在两个服务器上运行。。。不要给未涉及的产品贴标签。