Проблема объединения нормализованных реляционных таблиц для использования выбора для заполнения денормализованной версии их - PullRequest
1 голос
/ 01 мая 2019

В моей компании мы производим программное обеспечение для клиник, и мне было поручено подготовить выборку, чтобы заполнить ужасную и денормализованную таблицу лекарств одного из наших клиентов данными из красивых нормализованных таблиц от поставщика, на который наш клиент подпишется в ближайшее время.

Проблема в том, что у нас есть одна таблица, а провайдер имеет разброс данных между 3 таблицами. Наш VADEMECUM (который будет обрезан и заполнен select-insert); их - это dro (наркотики), drp (таблица лекарств и лекарств) и pro (медицина).

Столбцы из VADEMECUM, которые принимают участие в этой проблеме: CODIGO (идентификатор лекарства) и [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 со строкой drp с тем же кодом, но только одним (тот, который имеет значение = 1), а затем объединить с наркотиками таблица, чтобы получить название препарата.

Хуже всего то, что некоторые продукты не входят в drp, поэтому я должен добавить где-то ноль, чтобы не потерять продукты, а также есть некоторые продукты, которые не имеют значения = 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

1 Ответ

0 голосов
/ 01 мая 2019

Предварительная фильтрация

Вы можете присоединиться к подзапросам основного запроса и использовать Функции окна , чтобы назначить приоритет вашим значениям "Importancia".

ПрисоединитьсяПорядок

Вы можете управлять порядком соединения, используя скобки (такие же, как арифметический порядок), например,

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

. Вышеприведенное сначала объединит таблицы 'b' и 'c', и результат будетприсоединился к «а».Это вернет все строки «a» и все соответствующие комбинации «b + c».

Если, с другой стороны, вы удалите скобки, результат вернет меньше строк, так как результат «a + b» будет иметь некоторыеЗначения 'NULL' для '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 ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...