Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 如何优化涉及内部联接的条件子选择?_Sql Server 2008_Join_Query Optimization_Subquery_Commutativity - Fatal编程技术网

Sql server 2008 如何优化涉及内部联接的条件子选择?

Sql server 2008 如何优化涉及内部联接的条件子选择?,sql-server-2008,join,query-optimization,subquery,commutativity,Sql Server 2008,Join,Query Optimization,Subquery,Commutativity,我有一个SQL查询MS SQL 2008,我想在速度方面进行优化。只有在现实中,案例陈述中有10个不同的案例时,它才具有以下结构 重要的位是case语句中的子选择,它涉及附加表之间的内部联接以及对FROM子句table1中一个表的引用 我想我可以在FROM子句中使用左外连接而不是子选择来优化它,但我不确定,因为子选择也涉及内部连接。然后我会在FROM子句中使用两个左连接吗?现在我在子选择中使用一个内部连接?第二个案例中的另一个表3如何处理 任何想法都非常感谢 SELECT table1.

我有一个SQL查询MS SQL 2008,我想在速度方面进行优化。只有在现实中,案例陈述中有10个不同的案例时,它才具有以下结构

重要的位是case语句中的子选择,它涉及附加表之间的内部联接以及对FROM子句table1中一个表的引用

我想我可以在FROM子句中使用左外连接而不是子选择来优化它,但我不确定,因为子选择也涉及内部连接。然后我会在FROM子句中使用两个左连接吗?现在我在子选择中使用一个内部连接?第二个案例中的另一个表3如何处理

任何想法都非常感谢

    SELECT table1.a,
           table2.b,
           CASE
             WHEN table1.XY = 1 THEN
               (SELECT something
                FROM   AnotherTable1 at1
                       INNER JOIN AnotherTable2 at2
                               ON at1.x = at2.y
                WHERE  at1.abc = table2.abc)
             WHEN table1.XY = 2 THEN
               (SELECT something
                FROM   AnotherTable1 at1
                       INNER JOIN AnotherTable3 at3
                               ON at1.x = at3.y
                WHERE  at1.abc = table2.abc)
           END AS [problem]
    FROM   MyTable1 table1
           INNER JOIN MyTable2 table2
                   ON table1.a = table2.b 
您可以尝试以下操作:

SELECT 
    table1.a,
    table2.b,
    CASE 
        WHEN table1.XY = 1 THEN at2.something
        WHEN table1.XY = 2 THEN at3.something
    END
FROM   MyTable1 table1
INNER JOIN MyTable2 table2
    ON table1.a = table2.b 
LEFT JOIN AnotherTable1 at1
    ON at1.abc = table2.abc
INNER JOIN AnotherTable2 at2
    ON at1.x = at2.y
INNER JOIN AnotherTable3 at3
    ON at1.x = at3.y

但检查结果时,也请记住,在这种特殊情况下,at2和at3列必须具有相同的数据类型,即当两个部分中的另一个表1都连接时,如果条件相同,则只需要三个左连接:

SELECT table1.a,
       table2.b,
       CASE
         WHEN table1.XY = 1 THEN
           ?.something -- from whereever it's coming
         WHEN table1.XY = 2 THEN
           ?.something -- from whereever it's coming
       END AS [problem]
FROM   MyTable1 table1
       INNER JOIN MyTable2 table2
               ON table1.a = table2.b 
       LEFT JOIN AnotherTable1 at1
               ON at1.abc = table2.abc
       LEFT JOIN AnotherTable2 at2
               ON at1.x = at2.y
       LEFT JOIN AnotherTable3 at3
               ON at1.x = at3.y
在更一般的情况下,您可以选择此选项

FROM   MyTable1 table1
       INNER JOIN MyTable2 table2
               ON table1.a = table2.b 
       LEFT JOIN 
            (select *
               from AnotherTable1 at1
              INNER JOIN
                    AnotherTable2 at2
                      ON at1.x = at2.y   
            ) at1
               ON at1.abc = table2.abc
       ...

在这种情况下,我通常写选择。。。从表1到表1。。。左连接选择。。。从另一个表1到1。。。at1.abc=table2.abc和table1.XY=1上的at1…比较这似乎是错误的:当at1和table2之间的左连接将at1计算为null时,at1和at2之间的内部连接失败,行丢失。这与原始查询不同,原始查询中也会丢失,我不知道db模式,所以猜测有外键或smth,因为@DotNetDeveloper是这样做的,我这样得到的结果较少,问题如Michael所述。我认为问题在于,内部联接另一个表2 at2不仅意味着在上一个左联接上的内部联接,而且意味着在所有数据上的内部联接。