Sql server 连接规范化关系表以使用select填充非规范化版本的表时出现问题
在我的公司里,我们为诊所制作软件,我的任务是准备一个select,用我们的客户将在不久的将来订阅的供应商提供的漂亮的规范化表格中的数据填充我们客户的一个糟糕的非规范化药品表 问题是我们只有一个表,而提供者的数据分布在三个表之间。我们的是Vademicum(它将被截断并填充一个选择插入项);他们分别是dro(药物)、drp(药物-药物相关表)和pro(药物) 参与此问题的Vademicum专栏有:CODIGO(药物id)和[DROGA PRINCIPAL](药物的主要药物) 在我们的VADEMCUM表中,数据如下所示:Sql server 连接规范化关系表以使用select填充非规范化版本的表时出现问题,sql-server,tsql,Sql Server,Tsql,在我的公司里,我们为诊所制作软件,我的任务是准备一个select,用我们的客户将在不久的将来订阅的供应商提供的漂亮的规范化表格中的数据填充我们客户的一个糟糕的非规范化药品表 问题是我们只有一个表,而提供者的数据分布在三个表之间。我们的是Vademicum(它将被截断并填充一个选择插入项);他们分别是dro(药物)、drp(药物-药物相关表)和pro(药物) 参与此问题的Vademicum专栏有:CODIGO(药物id)和[DROGA PRINCIPAL](药物的主要药物) 在我们的VADEMCU
CODIGO: 1234 (lets say headache pills)
[DROGA PRINCIPAL]: 176 (lets say Ibuprofen)
我将用于填充vademicum的关系表具有如下数据:
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
Table pro
CODIGO: 1234
表drp
CODIGO PRODUCTO: 1234 || CODIGO DROGA: 176 || IMPORTANCE: 1
CODIGO PRODUCTO: 1234 || CODIGO DROGA: 276 || IMPORTANCE: 2
CODIGO PRODUCTO: 1234 || CODIGO DROGA: 144 || IMPORTANCE: 3
表dro
CODIGO DROGA: 176
CODIGO DROGA: 276
CODIGO DROGA: 144
我推荐了一些专栏,因为他们不参与这个问题,比如药品名称等等
如您所见,我需要一种方法来告诉SQL将medicine 1234行与drp
行连接起来,该行的代码相同,但只有一个(重要性为1的一个),然后与drugs表连接以获得药物名称
最糟糕的是,一些产品不在drp
中,因此我必须在非松散产品的某个位置添加一个where为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
预过滤
您可以加入主查询中的子查询,并使用为“importanceia”值分配优先级
联合订单
您可以使用括号(与算术顺序相同)来控制连接顺序,例如
上面的将首先联接“b”和“c”表,然后将结果联接到“a”。这将返回所有“a”行和匹配的任何“b+c”组合
另一方面,如果删除括号,则结果将返回较少的行,因为“a+b”结果的“b.col1”将有一些“NULL”值,而内部联接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
预过滤
您可以加入主查询中的子查询,并使用为“importanceia”值分配优先级
联合订单
您可以使用括号(与算术顺序相同)来控制连接顺序,例如
上面的将首先联接“b”和“c”表,然后将结果联接到“a”。这将返回所有“a”行和匹配的任何“b+c”组合
另一方面,如果删除括号,则结果将返回较少的行,因为“a+b”结果的“b.col1”将有一些“NULL”值,而内部联接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