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选择一行不,您的备选方案只选择一行。谢谢你们,所以我的思路是正确的,只是遗漏了几个关键点。