查询性能慢和错误排除-Where子句在@Table SQL Server 2012中查找值

查询性能慢和错误排除-Where子句在@Table SQL Server 2012中查找值,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个由多个部分组成的查询。我获取某些信息,并使用DECLARE@TABLENAME table()将其放入一个表中,然后在该表的正下方有一个查询,其中有一个where子句,如下所示 WHERE a.PatientAccountID IN ( SELECT Encounter FROM @TOC ) 在这个查询中@TOC.conference=A.PatientAccountID,因此我的理解是,这个查询将只查看@TOC表中的遭遇。事实并非如此,因此我假设正在进行一个完整的表

我有一个由多个部分组成的查询。我获取某些信息,并使用
DECLARE@TABLENAME table()
将其放入一个表中,然后在该表的正下方有一个查询,其中有一个where子句,如下所示

WHERE a.PatientAccountID IN (
    SELECT Encounter
    FROM @TOC
)
在这个查询中@TOC.conference=A.PatientAccountID,因此我的理解是,这个查询将只查看@TOC表中的遭遇。事实并非如此,因此我假设正在进行一个完整的表加载,然后使用where子句。我理解正确吗?我应该把where子句放在它上面的连接中吗?我知道这不是我想的那样,因为我必须补充

AND A.PatientAccountID NOT IN (
    '12345678910', '99990000999'
)
以防止错误

更新

我将连接更改为此(错误持续存在)

更新2

我已检查了
@TOC
遭遇
列,该表中不存在违规编号
12345678910
9999009999
。我试过使用

WHERE a.PatientAccountID IN (
    SELECT t.Encounter
    FROM @TOC t
)

到目前为止都没有用。。。同样奇怪的是,当我做以下事情时

SELECT t.Encounter
FROM @TOC t
冒犯性的遭遇id不会出现,但当我出现时

SELECT t.Encounter
FROM @TOC t
WHERE t.Encounter = '12345678910'
我得到的varchar转换错误为
@TOC。Conference
的类型为
INT
,因此我猜@GordonLinhoff最初指出了我的错误


谢谢,

[EDIT]根据您获得的错误和新信息判断,在与
遭遇
进行比较时,您似乎还需要将
PatientAccountID
转换为INT。这可以通过使用
CONVERT(INT,@Val)
cast(@Val as INT)
来实现

在子查询中使用
IN
子句时,即使找到
a.PatientAccountID
,子查询也会返回所有内容,因此,是的,发生了完整的表加载。如果要最小化表负载,可以将其更改为
EXISTS
,如下所示:

WHERE EXISTS
(
    SELECT t.Encounter
    FROM @TOC t
    WHERE t.Encounter = CONVERT(INT, a.PatientAccountID)
)
FROM smsmir.sc_patientvisit AS a
    LEFT OUTER JOIN smsdss.QOC_vst_summ_v AS b ON a.PatientAccountID = b.episode_no
    INNER JOIN @TOC AS t ON CONVERT(INT, a.PatientAccountID) = t.Encounter              
这将在找到匹配项后退出子查询,这使得此选项更适合您的修复

作为旁注,您还可以在
@TOC
上执行
内部联接
,联接条件与
遭遇
患者计数ID
匹配,如下所示:

WHERE EXISTS
(
    SELECT t.Encounter
    FROM @TOC t
    WHERE t.Encounter = CONVERT(INT, a.PatientAccountID)
)
FROM smsmir.sc_patientvisit AS a
    LEFT OUTER JOIN smsdss.QOC_vst_summ_v AS b ON a.PatientAccountID = b.episode_no
    INNER JOIN @TOC AS t ON CONVERT(INT, a.PatientAccountID) = t.Encounter              

[编辑]根据您获得的错误和新信息判断,在与
遭遇
进行比较时,您似乎还需要将
PatientAccountID
转换为INT。这可以通过使用
CONVERT(INT,@Val)
cast(@Val as INT)
来实现

在子查询中使用
IN
子句时,即使找到
a.PatientAccountID
,子查询也会返回所有内容,因此,是的,发生了完整的表加载。如果要最小化表负载,可以将其更改为
EXISTS
,如下所示:

WHERE EXISTS
(
    SELECT t.Encounter
    FROM @TOC t
    WHERE t.Encounter = CONVERT(INT, a.PatientAccountID)
)
FROM smsmir.sc_patientvisit AS a
    LEFT OUTER JOIN smsdss.QOC_vst_summ_v AS b ON a.PatientAccountID = b.episode_no
    INNER JOIN @TOC AS t ON CONVERT(INT, a.PatientAccountID) = t.Encounter              
这将在找到匹配项后退出子查询,这使得此选项更适合您的修复

作为旁注,您还可以在
@TOC
上执行
内部联接
,联接条件与
遭遇
患者计数ID
匹配,如下所示:

WHERE EXISTS
(
    SELECT t.Encounter
    FROM @TOC t
    WHERE t.Encounter = CONVERT(INT, a.PatientAccountID)
)
FROM smsmir.sc_patientvisit AS a
    LEFT OUTER JOIN smsdss.QOC_vst_summ_v AS b ON a.PatientAccountID = b.episode_no
    INNER JOIN @TOC AS t ON CONVERT(INT, a.PatientAccountID) = t.Encounter              

这篇评论太长了。你能试试这个版本吗

WHERE a.PatientAccountID IN (
    SELECT t.Encounter
    FROM @TOC t
)
一种可能性是,
@TOC
中的列实际上没有被称为
遭遇
——可能是一个轻微的拼写错误。如果没有限定的列名,SQL将从外部作用域中的表中获取字段——并且该字段和患者id可能始终相等。这可以解释没有发生过滤的事实

无论如何,最好始终使用限定的列名,以避免任何混淆


这只是一个想法。

评论太长了。你能试试这个版本吗

WHERE a.PatientAccountID IN (
    SELECT t.Encounter
    FROM @TOC t
)
一种可能性是,
@TOC
中的列实际上没有被称为
遭遇
——可能是一个轻微的拼写错误。如果没有限定的列名,SQL将从外部作用域中的表中获取字段——并且该字段和患者id可能始终相等。这可以解释没有发生过滤的事实

无论如何,最好始终使用限定的列名,以避免任何混淆


这只是一个想法。

WHERE子句非常清楚地将患者限制在
@TOC
列表中的患者(尽管
LEFT JOIN
版本没有)。您的问题存在于其他地方,
@TOC
中的数据或查询的其他部分。那么,您所指的错误是什么?我只运行了TOC表,没有看到令人不快的遭遇数字,所以我现在在新表中发生,我声明TOC摘要,其中有where子句。实际问题是什么?你得到的结果不正确吗?表演不好吗?你有错误吗?问题的不同部分表明了其中的任何一个或全部。查询性能很慢,我得到一个错误,来自上述varchar的转换导致溢出。我想我更关心的是错误,以及为什么当我指定我想要的遭遇时,我也得到了罪犯。@MCP\U渗透者遭遇和
PatientAccountID
的数据类型是什么?
PatientAccountID
中的值是什么?
WHERE
子句非常清楚地将患者限制在
@TOC
列表中的患者(尽管
左连接
版本没有)。您的问题存在于其他地方,
@TOC
中的数据或查询的其他部分。那么,您所指的错误是什么?我只运行了TOC表,没有看到令人不快的遭遇数字,所以我现在在新表中发生,我声明TOC摘要,其中有where子句。实际问题是什么?你得到的结果不正确吗?表演是ba吗