【问题标题】:Using two different where clauses使用两个不同的 where 子句
【发布时间】:2013-10-03 18:48:09
【问题描述】:

我想知道如何使用基于CASEIF 的不同WHERE 子句。我更喜欢CASE,因为该语句的其余部分很复杂,而且我不喜欢这种复杂性在两个地方只有微小差异的想法。但是,我知道案例仅用于值。我在下面复制了我的问题的一个简单版本。

基本上,我有三张桌子。第一个包含主信息(MasterTable)。第二个包含属于主表(Table1)的一对多关系。第三个是选择器列表,指示要在此实例中使用 Table1 中的哪些记录。我希望 Table2 的最新记录驱动从 Table1 中选择的内容,优先考虑 SubID 而不是 OrderNum。

主表 | MasterID、其他信息

表 1 | T1UniqueId、MasterID、SubID、Text、OrderNum

表2 | T2UniqueId、MasterID、SubID、OrderNum、日期

SELECT MasterID, OtherInfo, SubID
FROM MasterTable
OUTER APPLY(
    SELECT TOP 1 SubID FROM Table1
    WHERE Table1.MasterID=MasterTable.MasterID
    CASE
        WHEN 
        (
            SELECT TOP 1 SubID FROM Table2 
            WHERE Table2.MasterID=MasterTable.MasterID 
            ORDER BY Date DESC
        ) Is NULL
        THEN Table1.OrderNum=
            (
                SELECT TOP 1 OrderNum 
                FROM Table2
                WHERE Table2.MasterId=MasterTable.MasterId
                ORDER BY Date DESC
            )
        ELSE Table1.SubId=
            (
                SELECT TOP 1 SubId
                FROM Table2
                WHERE Table2.MasterId=MasterTable.MasterId
                ORDER BY Date DESC
            )
    END

) SubData

【问题讨论】:

  • 如果这可行,您仍然需要在 CASE 之前在 WHERE 子句中添加一个额外的 AND,但不幸的是 CASE 不能这样使用,它只是输出值从THENELSE 到嵌入表达式;你不能用它来输出条件。
  • @DrCopyPaste 谢谢。我确实知道这一点,但我不知道如何纠正它来做我想要的。我用这个案例来说明不仅仅是建议一个解决方案。

标签: tsql if-statement case where apply


【解决方案1】:

对此进行快速重写将导致以下结果:

IF ((SELECT TOP 1 SubID FROM Table2 WHERE Table2.MasterID=MasterTable.MasterID ORDER BY Date DESC) IS NULL)
BEGIN
    SELECT
            MasterID, OtherInfo, SubID
        FROM MasterTable
        OUTER APPLY(
            SELECT TOP 1 SubID FROM Table1
            WHERE
                Table1.MasterID=MasterTable.MasterID
                AND Table1.OrderNum =
                (
                    SELECT TOP 1 OrderNum 
                    FROM Table2
                    WHERE Table2.MasterId=MasterTable.MasterId
                    ORDER BY Date DESC
                )
        ) SubData
END
ELSE
BEGIN
    SELECT
            MasterID, OtherInfo, SubID
        FROM MasterTable
        OUTER APPLY(
            SELECT TOP 1 SubID FROM Table1
            WHERE
                Table1.MasterID=MasterTable.MasterID
                AND Table1.SubId=
                (
                    SELECT TOP 1 SubId
                    FROM Table2
                    WHERE Table2.MasterId=MasterTable.MasterId
                    ORDER BY Date DESC
                )
        ) SubData
END

但正如你所说,这让它看起来很丑,因为你现在在两个地方都有这种复杂性......

我猜你也可以这样表述(未经测试,但这应该将你的复杂逻辑放在一个地方):

SELECT
        MasterID, OtherInfo, SubID
    FROM MasterTable
    OUTER APPLY(
        SELECT TOP 1 SubID FROM Table1
        WHERE Table1.MasterID=MasterTable.MasterID
        AND
        (
            (
                (
                    SELECT
                            TOP 1 SubID
                        FROM Table2 
                        WHERE Table2.MasterID=MasterTable.MasterID 
                        ORDER BY Date DESC
                ) IS NULL
                AND
                Table1.OrderNum =
                (
                    SELECT TOP 1 OrderNum 
                    FROM Table2
                    WHERE Table2.MasterId=MasterTable.MasterId
                    ORDER BY Date DESC
                )
            )
            OR
            (
                Table1.SubId =
                (
                    SELECT
                            TOP 1 SubId
                        FROM Table2
                        WHERE Table2.MasterId=MasterTable.MasterId
                        ORDER BY Date DESC
                )
            )
        )
    ) SubData

【讨论】:

    【解决方案2】:

    如果 Table1 和 Table2 中的 SubID 和 OrderNum 相同,则可以使用嵌套 select 语句的简单查询:

    select m.MasterID, m.OtherInfo, (
      select top 1 coalesce(t2.SubID, t2.OrderNum) from Table2 t2
      where t2.MasterID = m.MasterID order by date desc
    ) as SubID
    from MasterTable m;
    

    【讨论】:

    • ordernum 和 subid 不同。 subID 是一个数字,而 ordernum 表示在列表中的位置。因此,顺序可能是 1,2,3,而子 ID 是 000111,000222,000333。我想根据 subid 进行选择,因为每个 masterid 可能有多个有序集。
    • 通过我的补充,我的意思是 Table1.SubID = Table2.SubID 和 Table1.OrderNum = Table2.OrderNum。如果适用,请尝试上面的查询
    • 这没有从我的数据中得到想要的答案。我不需要返回 subId 或 OrderNum。我需要在 table1 中返回匹配的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2023-03-31
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多