当前位置:  开发笔记 > 数据库 > 正文

动态/条件SQL加入?

如何解决《动态/条件SQL加入?》经验,为你挑选了2个好方法。

我在MSSQL表(TableB)中有数据,其中[dbo] .tableB.myColumn在特定日期之后更改格式...

我正在做一个简单的加入那张桌子..

Select [dbo].tableB.theColumnINeed from [dbo].tableA 
left outer join [dbo].tableB on [dbo].tableA.myColumn = [dbo].tableB.myColumn

但是,我需要使用不同的格式加入,基于表A中的日期列([dbo] .tableA.myDateColumn).

就像是...

Select [dbo].tableB.theColumnINeed from [dbo].tableA 
left outer join [dbo].tableB on [dbo].tableA.myColumn = 
    IF [dbo].tableA.myDateColumn > '1/1/2009'
        BEGIN
            FormatColumnOneWay([dbo].tableB.myColumn)
        END
    ELSE
        BEGIN
            FormatColumnAnotherWay([dbo].tableB.myColumn)
        END

我想知道是否有办法做到这一点..或者更好的方式我不想考虑这个...



1> Quassnoi..:
SELECT [dbo].tableB.theColumnINeed
FROM   [dbo].tableA 
LEFT OUTER JOIN [dbo].tableB
ON [dbo].tableA.myColumn = 
   CASE
    WHEN [dbo].tableA.myDateColumn <= '1/1/2009' THEN FormatColumnOneWay([dbo].tableB.myColumn)
    ELSE FormatColumnAnotherWay([dbo].tableB.myColumn)
   END



2> Kristen..:

您可以考虑使用UNION,而不是在JOIN中使用CASE语句来阻止使用索引进行查询

SELECT [dbo].tableB.theColumnINeed 
FROM   [dbo].tableA 
    LEFT OUTER JOIN [dbo].tableB 
         ON [dbo].tableA.myDateColumn > '1/1/2009'
        AND [dbo].tableA.myColumn = FormatColumnOneWay([dbo].tableB.myColumn)
UNION ALL
SELECT [dbo].tableB.theColumnINeed 
FROM   [dbo].tableA 
    LEFT OUTER JOIN [dbo].tableB 
         ON [dbo].tableA.myDateColumn <= '1/1/2009'
        AND [dbo].tableA.myColumn = FormatColumnAnotherWay([dbo].tableB.myColumn)

但是如果FormatColumnOneWay/FormatColumnAnotherWay是函数或字段表达式,可能会在[myColumn]上排除使用inxdexes,尽管myDateColumn上的任何索引仍然应该被使用

但是,它可能有助于理解FormatColumnOneWay/FormatColumnAnotherWay逻辑是什么,因为已知可以实现更好的优化

有几点需要注意:

UNION ALL不会删除任何重复项(与UNION不同).因为这两个子查询是互斥的,所以这是可以的,并保存UNION将使其能够删除重复项的SORT步骤.

您不应该使用'1/1/2009'样式作为字符串日期,您应该使用'yyyymmdd'样式而不使用斜杠或连字符(您也可以使用带参数的CONVERT来明确指示字符串是否为d/m/y或m/d/y样式

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有