在我的公司,我们为诊所做软件,我的任务是准备一个select,用我们的一个客户在不久的将来将订阅的漂亮的规范化表格中的数据填充我们的一个客户的可怕的和非规范化的药品表。
问题是我们有一个表,而提供者的数据分布在3个表中。我们的是VADEMECUM (将被截断并用select-insert填充);他们的是dro (药品)、drp (药品-药品相关表)和pro (药品)。
VADEMECUM中参与这个问题的列有: CODIGO (药物的id)和DROGA PRINCIPAL。
在我们的表VADEMECUM中,我们有这样显示的数据:
CODIGO: 1234 (lets say headache pills)
[DROGA PRINCIPAL]: 176 (lets say Ibuprofen)我将用来填充VADEMECUM的关系表具有如下数据:
表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表格拖放
CODIGO DROGA: 176
CODIGO DROGA: 276
CODIGO DROGA: 144我省略了一些列,因为它们不参与问题,例如药品名称等。
正如您所看到的,我需要一种方法来告诉SQL将MEDIC1234行与具有相同代码但只有一个(重要性为1的那一行)的drp行连接起来,然后与药品表连接以获得药物名称。
最糟糕的是,一些产品不在drp中,所以我必须在没有松散产品的地方添加一个where is null,还有一些产品没有重要性=1,但它们在所有的药物中都有重要性=0和重要性= 9 (都不重要,都是同样重要的),在这些情况下,我需要0和9的随机药物。
我希望我已经清楚了我的问题,我在其他地方找不到答案。提前感谢
我已经尝试过执行select操作,但缺少一些行。
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发布于 2019-05-01 15:58:14
预过滤
您可以连接到主查询中的子查询,并使用Window Functions为您的"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’值,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 ASChttps://stackoverflow.com/questions/55930217
复制相似问题