Mysql MAX(日期)给出的结果为空

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

我有一张汇率如下的桌子

我使用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(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?该查询不会同时在两个服务器上运行。。。不要给未涉及的产品贴标签。