Join 如何在SQL查询中添加包含左外联接的列

Join 如何在SQL查询中添加包含左外联接的列,join,left-join,sql,Join,Left Join,Sql,我有一个疑问: SELECT p.ProductName, dt.MaxTimeStamp, p.Responsible FROM Product p LEFT JOIN (SELECT ProductID, MAX(TimeStamp) AS MaxTimeStamp FROM StateLog WHERE State = 0 GROUP BY ProductID,

我有一个疑问:

   SELECT p.ProductName, 
          dt.MaxTimeStamp, 
          p.Responsible
     FROM Product p
LEFT JOIN (SELECT ProductID, MAX(TimeStamp) AS MaxTimeStamp
             FROM StateLog
            WHERE State = 0
         GROUP BY ProductID, State) dt ON p.ProductID = dt.ProductID 
ORDER BY p.ProductName;
它的工作原理和它应该的一样,但现在我也需要选择“State”out

棘手的是,我只想要“State”为false的最新“TimeStamp”。 但现在我还需要“状态”作为最新的“时间戳”

我试过这个:

   SELECT p.ProductName, dt.State, dt.MaxTimeStamp, p.Responsible
     FROM Product p
LEFT JOIN (SELECT ProductID, MAX(TimeStamp) AS MaxTimeStamp, State
             FROM StateLog
            WHERE State = 0
         GROUP BY ProductID, State) dt ON p.ProductID =dt.ProductID 
ORDER BY p.ProductName;
但它不起作用,因为它给了我最新“时间戳”的“状态”


所以我希望有一些聪明的人能帮助我。我猜这要么很简单,要么很难解决。

tvanfosson和OMG Ponies的格式化工作很棒

使用“分组依据”时,每列都需要: 1.对其应用聚合函数,或
2.出现在
分组依据
子句中

我不知道状态是什么,但我想你需要它。
这是一个查询外观的示例:

   SELECT p.ProductName, dt.State, dt.MaxTimeStamp, p.Responsible
     FROM Product p
LEFT JOIN (SELECT ProductID, Status, 
                  MAX(State) as State, MAX(TimeStamp) AS MaxTimeStamp
             FROM StateLog
            WHERE State = 0
         GROUP BY ProductID, Status) dt ON p.ProductID = dt.ProductID 
ORDER BY p.ProductName;

但所有这些都是愚蠢的,因为正如在一篇评论中提到的那样,您按
State=0进行过滤,因此您的查询不可能返回除0 for State之外的任何内容。

tvanfosson和OMG Ponies的出色格式化工作

使用“分组依据”时,每列都需要: 1.对其应用聚合函数,或
2.出现在
分组依据
子句中

我不知道状态是什么,但我想你需要它。
这是一个查询外观的示例:

   SELECT p.ProductName, dt.State, dt.MaxTimeStamp, p.Responsible
     FROM Product p
LEFT JOIN (SELECT ProductID, Status, 
                  MAX(State) as State, MAX(TimeStamp) AS MaxTimeStamp
             FROM StateLog
            WHERE State = 0
         GROUP BY ProductID, Status) dt ON p.ProductID = dt.ProductID 
ORDER BY p.ProductName;

但所有这些都是愚蠢的,因为正如在一篇评论中提到的那样,您通过
State=0进行过滤,因此您的查询不可能返回除0 for State之外的任何内容。

正在努力破译您正在寻找的内容,但字里行间的阅读可以总结为:

1) 最新状态日志。状态为零的时间戳

2) 最新状态日志的状态。时间戳

在这种情况下,以下(相当难看的)查询可能会起作用。假设组中的“状态”列是“状态”的打印错误,因为它没有返回到任何位置

SELECT
    p.ProductName
    , sl.State AS StateWithLatestTimeStamp
    , MAX(CASE WHEN dt1.State = 0 THEN dt1.MaxTimeStamp ELSE NULL END) AS LatestStateZeroTimeStamp
FROM
    (
    SELECT
        ProductID
        , State
        , MAX(TimeStamp) AS MaxTimeStamp
    FROM
        StateLog
    GROUP BY
        ProductId
        , State
    ) dt1
INNER JOIN
    StateLog sl
ON  sl.ProductID = dt1.ProductID
INNER JOIN
    Product p
ON  p.ProductID = sl.ProductID
GROUP BY
    p.ProductName
    , sl.State
    , sl.TimeStamp
HAVING
    sl.TimeStamp = MAX(dt1.MaxTimeStamp)

努力解读你在寻找什么,但字里行间的阅读可以概括为:

1) 最新状态日志。状态为零的时间戳

2) 最新状态日志的状态。时间戳

在这种情况下,以下(相当难看的)查询可能会起作用。假设组中的“状态”列是“状态”的打印错误,因为它没有返回到任何位置

SELECT
    p.ProductName
    , sl.State AS StateWithLatestTimeStamp
    , MAX(CASE WHEN dt1.State = 0 THEN dt1.MaxTimeStamp ELSE NULL END) AS LatestStateZeroTimeStamp
FROM
    (
    SELECT
        ProductID
        , State
        , MAX(TimeStamp) AS MaxTimeStamp
    FROM
        StateLog
    GROUP BY
        ProductId
        , State
    ) dt1
INNER JOIN
    StateLog sl
ON  sl.ProductID = dt1.ProductID
INNER JOIN
    Product p
ON  p.ProductID = sl.ProductID
GROUP BY
    p.ProductName
    , sl.State
    , sl.TimeStamp
HAVING
    sl.TimeStamp = MAX(dt1.MaxTimeStamp)
我想知道你的逻辑是否有点混乱。我看到你是按状态分组的,但你在任何地方都不使用状态。 我无法测试这一点,但如果您发布表创建脚本和数据填充脚本,我们可以快速测试它

我想知道你的逻辑是否有点混乱。我看到你是按状态分组的,但你在任何地方都不使用状态。
我无法对此进行测试,但如果您发布表创建脚本和数据填充脚本,我们可以快速进行测试。

Thx为我编辑tvanfosson。下次我会努力让自己变得更好。但是你过滤
state=0
,所以状态总是0…@radbyx——使用0101按钮或将代码示例缩进4个空格。您还可以使用backticks
`
来设置行的格式。我选择的4列用于ASP.NET Listview,其中我的数据源是此查询,因此我希望in可以在1个查询中完成所有操作,但我担心我做不到,除非有一些聪明的SQL技巧不可能猜到@tvanfosson,好的,谢谢。我喜欢这种SQL的写作风格。将来将使用.Thx为我编辑tvanfosson。下次我会努力让自己变得更好。但是你过滤
state=0
,所以状态总是0…@radbyx——使用0101按钮或将代码示例缩进4个空格。您还可以使用backticks
`
来设置行的格式。我选择的4列用于ASP.NET Listview,其中我的数据源是此查询,因此我希望in可以在1个查询中完成所有操作,但我担心我做不到,除非有一些聪明的SQL技巧不可能猜到@tvanfosson,好的,谢谢。我喜欢这种SQL的写作风格。将在未来使用。Thx,它没有改变任何东西。我喜欢用简明扼要的方式来描述目标,从现在开始我会这样做。正如我在评论中提到的,你的假设是正确的。Thx,它没有改变任何东西。我喜欢用简明扼要的方式来描述目标,从现在开始我会这样做。正如我在评论中提到的,你的假设是正确的。状态和状态相同,对不起我的坏。状态和状态相同,对不起我的坏。状态和状态相同,对不起我的坏。状态和状态相同,对不起我的坏。