首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接规范化关系表以使用select填充它们的非规范化版本时出现问题

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

Stack Overflow用户
提问于 2019-05-01 08:20:16
回答 1查看 33关注 0票数 1

在我的公司,我们为诊所做软件,我的任务是准备一个select,用我们的一个客户在不久的将来将订阅的漂亮的规范化表格中的数据填充我们的一个客户的可怕的和非规范化的药品表。

问题是我们有一个表,而提供者的数据分布在3个表中。我们的是VADEMECUM (将被截断并用select-insert填充);他们的是dro (药品)、drp (药品-药品相关表)和pro (药品)。

VADEMECUM中参与这个问题的列有: CODIGO (药物的id)和DROGA PRINCIPAL

在我们的表VADEMECUM中,我们有这样显示的数据:

代码语言:javascript
复制
CODIGO: 1234 (lets say headache pills)
[DROGA PRINCIPAL]: 176 (lets say Ibuprofen)

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

表pro

代码语言:javascript
复制
CODIGO: 1234

表drp

代码语言:javascript
复制
CODIGO PRODUCTO: 1234 || CODIGO DROGA: 176 || IMPORTANCE: 1
CODIGO PRODUCTO: 1234 || CODIGO DROGA: 276 || IMPORTANCE: 2
CODIGO PRODUCTO: 1234 || CODIGO DROGA: 144 || IMPORTANCE: 3

表格拖放

代码语言:javascript
复制
CODIGO DROGA: 176
CODIGO DROGA: 276
CODIGO DROGA: 144

我省略了一些列,因为它们不参与问题,例如药品名称等。

正如您所看到的,我需要一种方法来告诉SQL将MEDIC1234行与具有相同代码但只有一个(重要性为1的那一行)的drp行连接起来,然后与药品表连接以获得药物名称。

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

我希望我已经清楚了我的问题,我在其他地方找不到答案。提前感谢

我已经尝试过执行select操作,但缺少一些行。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-05-01 15:58:14

预过滤

您可以连接到主查询中的子查询,并使用Window Functions为您的"Importancia“值分配优先级。

联接顺序

您可以通过使用括号(与算术顺序相同)来控制联接顺序。

代码语言:javascript
复制
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将过滤掉这些值。

摘要

您的代码应该如下所示:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55930217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档