2014-02-18 2 views
2

СПРАВОЧНАЯзапрессовки с групповым символом не соответствующие строки

У меня есть две таблицы:

drugDistributionHistory - детализирует то, что/когда наркотики были распределены ти пациентов.

drugPrices - цены на лекарства.

В этом примере я рассматриваю препарат под названием «FLUOXETINE», также известный как «ПРОЗАК».

Если я запрашиваю для этого препарата в drugPrices таблицы, я уступаю эти результаты:

SELECT 
    drugName, 
    drugBrandName, 
    drugStrength, 
    drugDosage, 
    drugPrice 
FROM 
    drugPrices 
WHERE 
    drugName like '%fluoxetine%' 

Результаты:

FLUOXETINE PROZAC 10MG CAP 0.02 
FLUOXETINE PROZAC 20MG CAP 0.05 

В моей drugDistributionHistory таблицы, я ищу этот же тип препарата , однако, лекарственное средство можно вводить по-разному, например:

select 
    drugName, 
    strength, 
    measurement 
from 
    drugDistributionHistory ddh 
    INNER JOIN facilities f ON ddh.facilityId = f.facilityId 
where 
    f.facilityId = 40 
    AND ddh.resultCode = 'Received' 
    AND MONTH(dateGiven) = '01' 
    AND YEAR(dateGiven) = '2014' 
    and ddh.drugName like 'fluoxetine%' 

заказ по ddh.drugName

Результаты:

Fluoxetine/Prozac 60.00 mg 
Fluoxetine/Prozac 20.00 mg 

ВОПРОС

Мой запрос, чтобы попытаться соответствовать наркотики с их ценами выглядит следующим образом. Я пытаюсь соответствовать либо на drugName или drugBrandName (т.е. Прозак является торговой маркой препарат флуоксетин):

select 
    drugName, 
    strength, 
    measurement 
from 
    drugDistributionHistory ddh 
    INNER JOIN facilities f ON ddh.facilityId = f.facilityId 
    INNER JOIN drugPrices dp ON 
     ('%' + dp.drugName + '%' like '%' + ddh.drugName + '%' 
     OR '%' + dp.drugBrandName + '%' like '%' + ddh.drugName + '%') 
where 
    f.facilityId = 40 
    AND ddh.resultCode = 'Received' 
    AND MONTH(dateGiven) = '01' 
    AND YEAR(dateGiven) = '2014' 
    and ddh.drugName like 'fluoxetine%' 
order by 
    ddh.drugName 

не найдено.

Я неверно истолковываю как использовать подстановочные знаки при соединении таблиц?

+0

Я думаю, что самое большое неправильное толкование состоит в том, что вы думаете, что это хорошая идея. Почему бы вам не присоединиться к наркотику? –

+0

К сожалению, данные поступают из двух совершенно разных систем, и единственное, к чему я могу присоединиться, это названия препаратов. – etm124

ответ

0

Поскольку вы положили знаки процента с обеих сторон оператора LIKE, я подозреваю, что вы неправильно полагаете, что LIKE является симметричным; это не. Вы не получили ни одного матча, так как ни '%Fluoxetine%', ни '%Prozac%' всего совпадений '%Fluoxetine/Prozac%' из таблицы drugDistributionHistory в правой части от LIKE.Тем не менее, вы получите игру, если ваши операнды перейти на другую сторону:

INNER JOIN drugPrices dp ON 
    (ddh.drugName LIKE '%' + dp.drugName + '%' 
    OR ddh.drugName LIKE '%' + dp.drugBrandName + '%') 

Левая рука LIKE не нуждается % признаков.

+2

Если вы не уверены в качестве данных, вы также должны сделать обрезку: 'ddh.drugName LIKE '%' + LTRIM (RTRIM (dp.drugName)) + '%''. –

1

Я думаю

INNER JOIN drugPrices dp ON 
     ('%' + dp.drugName + '%' like '%' + ddh.drugName + '%' 
     OR '%' + dp.drugBrandName + '%' like '%' + ddh.drugName + '%') 

Должно быть

INNER JOIN drugPrices dp ON 
     (dp.drugName like '%' + ddh.drugName + '%' 
     OR dp.drugBrandName like '%' + ddh.drugName + '%') 

Обратите внимание на удаление символов% на полях источника. Вы используете их только с правой стороны оператора LIKE.

Конечно, это приведет только к результатам, в которых имя dp.drugName содержит имя ddh.drugName или dp.drugBrandName, содержащее имя ddh.DrugName. Это приемлемо?

+0

+1 «Вы используете только% символов в правой части оператора LIKE». – wruckie

1

Я подозреваю, что вы хотите учитывать разделители вокруг имени лекарственного средства, чтобы избежать путаницы (например, так что «abc» не будет соответствовать «abcd»). Если так, вы можете сделать это как:

from 
    drugDistributionHistory ddh 
    INNER JOIN facilities f ON ddh.facilityId = f.facilityId 
    INNER JOIN drugPrices dp ON 
     (' ' + dp.drugName + ' ' like '% ' + ddh.drugName + '%' 
     OR ' ' + dp.drugBrandName + ' ' like '% ' + ddh.drugName + ' %') 
Смежные вопросы