0
SELECT  PRH.prid,  PRH.CreationDate, PRH.ClosedDate, PRA.creationdate
FROM PRHeader PRH
left join  PRAction PRA on PRH.PrId =  PRA.PrId
WHERE 
PRA.CreationDate =
(select min(CreationDate  )  from PRAction pa  WHERE  PRH.prid=pa.prid 
 and pa.ActionTypeId<>4)

好的,我不知道如何解释这个......但是我有一个表 PRHeader 与对象 PRHeader 中的每个对象在 PRAction 中都有 0 多个相关操作。上面的代码为每个具有相关 actiontype 的对象获取最早的操作,因为我想要那个的时间戳。问题是某些对象没有任何符合此条件的操作,然后我仍然希望返回该对象,但操作时间为 null。显然我只想要每个对象一次。有什么建议吗?

非常感谢戈登·林诺夫!效果很好!

4

2 回答 2

3

您可以将where条件移动到from子句中,您可以在其中left outer join。一种方法是将条件放在on子句中:

SELECT  PRH.prid,  PRH.CreationDate, PRH.ClosedDate, PRA.creationdate
FROM PRHeader PRH left join 
     PRAction PRA
     on PRH.PrId = PRA.PrId and
        PRA.CreationDate = (select min(CreationDate)
                            from PRAction pa 
                            WHERE  PRH.prid = pa.prid and pa.ActionTypeId<>4
                           );

另一种方法是将其作为join条件:

select  PRH.prid,  PRH.CreationDate, PRH.ClosedDate, pa.creationdate
from PRHeader PRH left join
     (select prid, min(CreationDate)
      from PRAction pa 
      where pra.ActionTypeId <> 4
      group by prid
     ) pa
     on PRH.prid = pa.prid;

最后,如果您不想进行聚合,可以将字段计算移至select子句:

select PRH.prid, PRH.CreationDate, PRH.ClosedDate,
       (select min(CreationDate)
        from PRAction pa 
        where  PRH.prid = pa.prid and pa.ActionTypeId <> 4
       ) as CreationDate
from PRHeader PRH;

虽然这看起来像一个聚合,但引擎应该能够PRAction(prid, CreationDate)直接使用索引。您可以通过创建子查询使这一点更明显(使用 MySQL 语法):

       (select CreationDate
        from PRAction pa 
        where PRH.prid = pa.prid and pa.ActionTypeId <> 4
        order by CreationDate
        limit 1
       ) as CreationDate
于 2013-09-05T21:28:39.120 回答
0

您可以尝试在您的问题中使用左连接,但要连接到嵌套查询。我认为它会是这样的:

SELECT PRH.prid, PRH.CreationDate, PRH.ClosedDate, PRA.creationdate
  FROM PRHeader PRH
  left outer join  (
       SELECT * 
         FROM PRAction pa
        WHERE pa.CreationDate = (
              SELECT min(pa2.CreationDate)
                FROM PRAction pa2
               WHERE pa.prid=pa2.prid 
                 AND pa2.ActionTypeId<>4)
             ) PRA on PRH.PrId =  PRA.PrId
于 2013-09-05T21:31:41.557 回答