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子句以丢弃重复的行