Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
T-SQL左外部联接选择顶部1-最大值_Sql_Sql Server_Tsql - Fatal编程技术网

T-SQL左外部联接选择顶部1-最大值

T-SQL左外部联接选择顶部1-最大值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表中的数据,如下所示: encounter | prov_id_name --------------------------- 12345678 | 123456ProviderA 然后,我希望在维度表中的提供者id上匹配它,而不是在dim表中有匹配项的情况下拉入子字符串 尺寸表如下所示: orgz_cd | src_pract_no | pract_rpt_name ---------------------------------------- 0002 | 123456

我有一个表中的数据,如下所示:

encounter | prov_id_name
---------------------------
12345678  | 123456ProviderA
然后,我希望在维度表中的提供者id上匹配它,而不是在dim表中有匹配项的情况下拉入子字符串

尺寸表如下所示:

orgz_cd | src_pract_no | pract_rpt_name
----------------------------------------
0002    | 123456       | PROVIDER A X
1234    | 123456       | Provider A
4321    | 123456       | Provider A
我使用以下SQL来获得我所需要的:

LEFT OUTER JOIN (
    SELECT ZZZ.src_pract_no
    , MAX(ZZZ.pract_rpt_name) PRACT_RPT_NAME
    FROM smsdss.pract_dim_v AS ZZZ
    GROUP BY src_pract_no
) AS MD
ON LEFT(HL7.PRIM_CARE_PROV_NAME_ID, 6) = MD.SRC_PRACT_NO
我的问题是为什么这不起作用,这是我最初尝试的,根本不会产生任何结果:

LEFT OUTER JOIN (
    SELECT TOP 1 ZZZ.src_pract_no
    , MAX(ZZZ.pract_rpt_name) PRACT_RPT_NAME
    FROM smsdss.pract_dim_v AS ZZZ
) AS MD
ON LEFT(HL7.PRIM_CARE_PROV_NAME_ID, 6) = MD.SRC_PRACT_NO
我还尝试:

LEFT OUTER JOIN smsdss.pract_dim_v AS MD
ON LEFT(HL7.PRIM_CARE_PROV_NAME_ID, 6) = (
    SELECT TOP 1 SRC_PRACT_NO
    , PRACT_RPT_NAME
    FROM SMSDSS.PRACT_DIM_V
)

我认为没有返回任何结果,或者说它没有像我预期的那样工作,因为对于返回的第一个结果,子查询只被计算一次,没有找到匹配项,然后就这样了,但我不确定。

我想您需要
外部应用

OUTER APPLY
(SELECT TOP 1 pd.pract_rpt_name
 FROM smsdss.pract_dim_v pd
 WHERE LEFT(HL7.PRIM_CARE_PROV_NAME_ID, 6) = pd.SRC_PRACT_NO
 -- ORDER BY ?
) MD

如果您希望在有多个匹配项时使用特定名称(例如最长或最近的名称),请使用排序依据。

我想您希望
外部应用

OUTER APPLY
(SELECT TOP 1 pd.pract_rpt_name
 FROM smsdss.pract_dim_v pd
 WHERE LEFT(HL7.PRIM_CARE_PROV_NAME_ID, 6) = pd.SRC_PRACT_NO
 -- ORDER BY ?
) MD

如果要在存在多个匹配项时使用特定名称(例如最长或最近的名称),请使用
ORDER BY

是的,如果您是正确的,子查询将只执行一次,并且不能保证它将匹配您在ON条件中查找的ID。1<代码>顶部(n)如果没有
订购人
,就没有多大意义。它只是从匹配中选取任意记录。2. <代码>选择前1个ZZZ.src\u pract\u no,MAX(ZZZ.pract\u rpt\u name)无效,没有由ZZZ.src\u pract\u no组成的
组。3.原始子查询会为每个src_pract_选择一行。不,您的备选方案只选择一行。谢谢你们,所以我的思路是正确的,只是缺少了几个关键点。是的,您是正确的,子查询只会执行一次,并且不能保证它会匹配您在on条件下查找的ID。1<代码>顶部(n)
如果没有
订购人
,就没有多大意义。它只是从匹配中选取任意记录。2. <代码>选择前1个ZZZ.src\u pract\u no,MAX(ZZZ.pract\u rpt\u name)无效,没有由ZZZ.src\u pract\u no组成的
组。3.原来的子查询为每个src\u pract\u选择一行不,您的备选方案只选择一行。谢谢你们,所以我的思路是正确的,只是遗漏了几个关键点。