联接规范化关系表以使用 select 填充它们的非规范化版本时出现问题



在我的公司里,我们为诊所制作软件,我的任务是准备一个选择,用来自供应商的美丽标准化表格的数据来填充我们一个客户的糟糕和非规范化的药物表,我们的客户将在不久的将来订阅。

问题是我们有一个表,而提供程序的数据分布在 3 个表之间。我们的是 VADEMECUM(将被截断并填充一个选择插入);他们是DRO(药物),DRP(药物 - 医学相关表)和PRO(医学)。

参与此问题的VADEMECUM专栏是:CODIGO(药物的ID)和[DROGA PRINCIPAL](药物的主要药物)。

在我们的表格 VADEMECUM 中,我们以这种方式显示了数据:

CODIGO: 1234 (lets say headache pills)
[DROGA PRINCIPAL]: 176 (lets say Ibuprofen)

我将用于填充 VADEMECUM 的关系表具有如下数据:

表亲

CODIGO: 1234

表目录

CODIGO PRODUCTO: 1234 || CODIGO DROGA: 176 || IMPORTANCE: 1
CODIGO PRODUCTO: 1234 || CODIGO DROGA: 276 || IMPORTANCE: 2
CODIGO PRODUCTO: 1234 || CODIGO DROGA: 144 || IMPORTANCE: 3

表德罗

CODIGO DROGA: 176
CODIGO DROGA: 276
CODIGO DROGA: 144

我省略了一些列,因为它们不参与诸如药物名称之类的问题。

如您所见,我需要一种方法来告诉 SQL 将药物 1234 行与具有相同代码但只有一个代码(重要性 = 1 的那个)的drp行连接,然后与药物表连接以获取药物名称。

最糟糕的是有些产品不在drp所以我必须在某处添加一个 where is null 以免松散产品,还有一些产品的重要性 = 1,但它们在所有药物中的重要性 = 0 和重要性 = 9(所有这些都不重要,并且都同样重要),在这些情况下,我需要 0 和随机的 0药物为那些有9。

我希望我清楚我的问题,我在其他任何地方都找不到答案。 提前致谢

我已经尝试进行选择,但我缺少一些行。

SELECT 
1 ID,
1 ID_Referencia,
[pro].[Clave] AS Código,
[pre].CodigoBarras AS [Código de Barras],
[pre].CodigoTroquel AS [Código Troquel],
NULL [Droga secundaria],
[pro].[Descripcion] AS Marca,
[ClaveLab] AS [Código del Laboratorio],
[ClaveLabCom] AS [Código de Proveedor],
[pre].Descripcion AS Presentacion
FROM 
[dbo].[pro]
--1
LEFT JOIN 
[dbo].[pre] ON [pro].[Clave] = [dbo].[pre].ClaveProducto
--2
--LEFT JOIN 
--    [dbo].[drp] ON [pro].[Clave] = [dbo].[drp].ClaveProducto 
--WHERE 
--    [drp].Importancia = 1 OR [dbo].[drp].ClaveProducto IS NULL OR   [drp].Importancia = 0 OR [drp].Importancia = 9  
--3
--INNER JOIN 
--    [dnp].[dro] ON [drp].ClaveDroga = [dro].Clave
ORDER BY 
Código ASC

预过滤

您可以连接到主查询中的子查询,并使用窗口函数为"Importancia"值分配优先级。

加盟顺序

您可以使用括号(与算术顺序相同)来控制连接顺序,例如

FROM a
LEFT JOIN ( b
INNER JOIN c ON b.col1 = c.col1 ) ON a.col2 = b.col2

上面的将首先连接"b"和"c"表,然后将结果连接到"a"。这将返回所有匹配的"a"行和任何"b+c"组合。

另一方面,如果您删除括号,则结果将返回更少的行,因为"a+b"结果将具有"b.col1"的一些"NULL"值,INNER JOIN c会过滤掉这些值。

总结

您的代码应如下所示:

SELECT 
1 ID,
1 ID_Referencia,
[pro].[Clave] AS Código,
[pre].CodigoBarras AS [Código de Barras],
[pre].CodigoTroquel AS [Código Troquel],
NULL [Droga secundaria],
[pro].[Descripcion] AS Marca,
[ClaveLab] AS [Código del Laboratorio],
[ClaveLabCom] AS [Código de Proveedor],
[pre].Descripcion AS Presentacion
FROM 
[dbo].[pro]
LEFT JOIN 
[dbo].[pre] ON [pro].[Clave] = [dbo].[pre].ClaveProducto
LEFT JOIN 
(( SELECT *,
ROW_NUMBER() OVER( PARTITION BY ClaveProducto
ORDER BY CASE importance WHEN 1 THEN 1 WHEN 0 THEN 2 ELSE 3 END ) AS Importance
FROM dbo.drp ) AS drp
INNER JOIN [dnp].[dro] ON [drp].ClaveDroga = [dro].Clave AND Importance = 1 )
ON [pro].[Clave] = [dbo].[drp].ClaveProducto 
ORDER BY 
Código ASC

最新更新