JOIN中的Sql查询优化问题

JOIN中的Sql查询优化问题,sql,sql-server,join,query-optimization,Sql,Sql Server,Join,Query Optimization,我在一个查询中有多个JOIN语句,我必须在JOIN中检查两个设置。如何以最好的方式做到这一点 table: WebSettings ------------------------------------------------------- Name | Setting | InstID | WebSettingID ------------------------------------------------------- 'EnableError' |

我在一个查询中有多个
JOIN
语句,我必须在
JOIN
中检查两个设置。如何以最好的方式做到这一点

table: WebSettings
-------------------------------------------------------
Name            | Setting   | InstID    | WebSettingID
-------------------------------------------------------
'EnableError'   | 2 | 1111  | 1
'ErrorsSetting' | 0 | 2121  | 2

Index :

InstID
WebSettingID (InstID)


table: InstProd
-------------------------------------------------------
InstitutionID   | Name
-------------------------------------------------------
1111        | 'Bank of Ind'
2121        | 'IOB'


Index :

InstitutionID


SELECT 

Column1,
DATEADD(.....)

FROM 
dbo.InstProd I 
INNER JOIN dbo.WebSettings WS1 ON
WS1.InstitutionID = I.InstID AND
WS1.Name = 'EnableError' AND WS1.Setting=2
INNER JOIN dbo.WebSettings WS2 ON
WS2.InstitutionID = I.InstID AND
WS2.Name = 'ErrorsSetting' AND WS2.Setting=0
WHERE.....
我想检查
JOIN
中的一个
WebSettings=2
other=0


有最好的解决方案吗?

是的,您不需要两次加入
WebSettings
,尽管您没有发布预期的输出,所以我不知道具体怎么做,但请调整:

SELECT <column1>,<column2>,
       MAX(CASE WHEN ws.Name = 'EnableError' AND ws.settings = 2 THEN <YourDesiredColumn> END) as enable_column,
       MAX(CASE WHEN ws.Name = 'ErrorsSetting' AND ws.settings = 0 THEN <YourDesiredColumn2> END) as Errors_column
FROM bo.InstProd I 
INNER JOIN dbo.WebSettings WS1 ON
WS1.InstitutionID = I.InstID AND
(WS.Name,ws.setting) in (('EnableError',2),('ErrorsSetting',0)) 
GROUP BY <column1>,<column2>
选择,,
最大值(当ws.Name='EnableError'和ws.settings=2时的情况,然后结束)作为enable_列,
最大值(当ws.Name='ErrorsSetting'和ws.settings=0时的情况,然后结束)作为Errors\u列
来自bo.InstProd I
上的内部联接dbo.WebSettings WS1
WS1.InstitutionID=I.Instituted和
(('EnableError',2),('ErrorsSetting',0))中的(WS.Name,WS.setting)
分组:,

这将在同一行中为您提供enable和error列,就像您的查询一样。

最小化
联接
可能会得到您期望的结果,如果您不使用
WS2

SELECT 
 Column1,
 DATEADD(.....)

FROM
dbo.InstProd I 
INNER JOIN dbo.WebSettings WS1 ON WS1.InstitutionID = I.InstID 
                               AND ( WS1.Name = 'EnableError' 
                                     AND WS1.Setting = 2 )
                               OR ( WS1.Name = 'ErrorsSetting' 
                                    AND WS1.Setting = 0)  
WHERE.....

您可以决定不使用
JOIN
,作为我的以下解决方案

如果希望所有
InstProd
都具有
EnableError=2
ErrorSettings=0

试试这个:

SELECT I.*
FROM InstProd I
WHERE EXISTS
    (SELECT 'EnableError = 2'
        FROM WebSettings WS
        WHERE WS.InstID = I.InstitutionID
        AND WS.Name = 'EnableError' AND WS.Setting = 2)
AND EXISTS
   (SELECT 'EnableError = 2'
        FROM WebSettings WS
        WHERE WS.InstID = I.InstitutionID
        AND WS.Name = 'ErrorSettings' AND WS.Setting = 0)
SELECT I.*,
CASE
    WHEN
        (SELECT COUNT(1)
        FROM WebSettings WS
        WHERE WS.InstID = I.InstitutionID
        AND WS.Name = 'EnableError' AND WS.Setting = 2) > 0
        AND
        (SELECT COUNT(1)
        FROM WebSettings WS
        WHERE WS.InstID = I.InstitutionID
        AND WS.Name = 'ErrorSettings' AND WS.Setting = 0) > 0
  THEN 'OK'
  ELSE 'KO'
END
FROM InstProd I
如果需要所有
InstProd
,请检查两个设置值

试试这个:

SELECT I.*
FROM InstProd I
WHERE EXISTS
    (SELECT 'EnableError = 2'
        FROM WebSettings WS
        WHERE WS.InstID = I.InstitutionID
        AND WS.Name = 'EnableError' AND WS.Setting = 2)
AND EXISTS
   (SELECT 'EnableError = 2'
        FROM WebSettings WS
        WHERE WS.InstID = I.InstitutionID
        AND WS.Name = 'ErrorSettings' AND WS.Setting = 0)
SELECT I.*,
CASE
    WHEN
        (SELECT COUNT(1)
        FROM WebSettings WS
        WHERE WS.InstID = I.InstitutionID
        AND WS.Name = 'EnableError' AND WS.Setting = 2) > 0
        AND
        (SELECT COUNT(1)
        FROM WebSettings WS
        WHERE WS.InstID = I.InstitutionID
        AND WS.Name = 'ErrorSettings' AND WS.Setting = 0) > 0
  THEN 'OK'
  ELSE 'KO'
END
FROM InstProd I

请更好地解释你的要求。您想要什么作为输出?添加表定义和索引!那代码甚至不会运行。代码中缺少和/或子句。@Keppy:解释您的目标。我不知道你的选择(加入)是不是最好的。但是您必须发布您的表结构和您的愿望result@JoeTaras添加了更多信息。我将在验证后返回。谢谢,我试过了,但与我的剧本相比,没有看到任何性能上的改进,所以决定用我的剧本。谢谢你的支持。我会在核实后再回来。谢谢,我试过了,但与我的剧本相比,没有看到任何性能上的改进,所以决定用我的剧本。谢谢你的支持。从性能的角度来看,您会推荐哪一种?如果我的记录数很高,是否加入或存在?我认为不存在适用于所有情况的命令。取决于您想要什么,在本例中exists子句对于第一种情况(因为您不显示这些信息,但仅用于条件)是可以的,对于第二种情况(因为只有两个字段),我更喜欢选择字段列表中的子查询。对于联接,必须应用group by或distinct子句以丢弃重复的行