2014-09-04 104 views
0

我正在处理大型存储过程,我遇到了一小部分问题。SQL - OutterApply和左连接

当我在表im上执行查询时,可能会有0,1或2个结果。如果有0个结果,我真的不在乎,我的代码返回空值,没什么大不了的。如果有1个结果,我的代码将返回正确的值,但是,如果有2个结果,我无法选择第二个结果。

我的代码如下工作,直到第二个OutterApply(AHM2的东西)。有没有人看到我在做什么错了?

两个OuterApplys的动物ID是相同的。我只需要返回第二个结果(如果有的话),以及是否与第一个结果不同。

SELECT TOP 1 
     AHM.AnimalHerdManagementId, 
     AHM.HerdManagementId, 
     AHM2.AnimalHerdManagementId, 
     AHM2.HerdManagementId, 
     HM.Code AS HerdManagementCode, 
     HM2.Code AS HerdManagementCode2 
OUTER APPLY 
     (
      SELECT TOP 1 AHM.AnimalHerdManagementId, AHM.HerdManagementId 
      FROM dbo.AnimalHerdManagement AHM 
      WHERE AHM.AnimalId = A.AnimalId AND ISNULL(AHM.EffectiveFrom, @EffectiveFrom) <= @EffectiveFrom 
      ORDER BY AHM.EffectiveFrom DESC 
     ) AHM 
     LEFT JOIN dbo.HerdManagement HM ON AHM.HerdManagementId = HM.HerdManagementId 
     OUTER APPLY 
     (
      SELECT TOP 1 AHM2.AnimalHerdManagementId, AHM2.HerdManagementId 
      FROM dbo.AnimalHerdManagement AHM2 
      WHERE AHM2.AnimalId = A.AnimalId AND AHM2.AnimalHerdManagementId != AHM.AnimalHerdManagementId AND ISNULL(AHM2.EffectiveFrom, @EffectiveFrom) <= @EffectiveFrom 
      ORDER BY AHM2.EffectiveFrom DESC 
     ) AHM2 
LEFT JOIN dbo.HerdManagement HM2 ON AHM2.HerdManagementId = HM2.HerdManagementId 
+0

我有点懒,所以我的第一次努力将返回两行,而不是试图返回他们塞进一排。根据我的经验,将行转换为列是PITA。这有可能吗? – KingOfAllTrades 2014-09-04 18:40:00

+0

这不是不幸的。我只是修改现有的sp。并添加此列。真的可以改变它,取决于它。 – Mark 2014-09-04 18:44:13

+1

我想尽可能多,否则你可能不会这样做。但是我做了前言,因为我有点懒惰......你能发布你得到的结果吗? – KingOfAllTrades 2014-09-04 18:48:18

回答

1

我想我可以帮你的OUTER APPLY但得到了两个不同的值的方法会需要一些帮助,我的解决方案是一个总的黑客。

首先,你不需要加入外部申请。暗示加入。因此,您可以完全消除查询中的连接语法。

二,AnimalHerdManagement看起来像一个称为连接表的特殊表。其中包含的所有数据都包含在其他地方(它包含完全冗余的数据就是为什么它被称为特殊表)。但那是微不足道的。

最后,下面是一些示例代码,我把它们放在一起,完成了你所要做的事情。我用来检索两个外部应用程序的不同结果的方法是黑客攻击,但是如果您确定它永远是真的,它可能会奏效。我无法获得多层次的外部申请工作。

select * from AH_Animal A 
outer apply 
(
    select max (HerdManagementID) as HerdMgmtID1 from AH_AnimalHerdManagement HM1 where HM1.AnimalID = A.AnimalID 
) as z 
outer apply 
(
    select min (HerdManagementID) as HerdMgmtID2 from AH_AnimalHerdManagement HM2 where HM2.AnimalID = A.AnimalID 
) as zz 

我希望有所帮助。必须有另一个解决方案,因为如果你曾经预期过3次结果,这根本就不起作用。

查询结果:

Query Results

+0

这应该工作正常,有防止有第三个结果的可能性的业务规则。谢谢.. – Mark 2014-09-04 19:57:50