Использование оператора Like в запросе Select с результатами другого запроса Select - PullRequest
0 голосов
/ 07 мая 2020

У меня есть запрос с внутренними соединениями, который возвращает 4-5 строк - запрос:

select Table1.valstring Prefix
from TestDB.dbo.SomeCompany PC
    INNER JOIN TestDB.dbo.CMCompany CMC ON PC.companyuid = CMC.companyuid
    LEFT OUTER JOIN TestDB.dbo.ATRIBUTE Table1 ON Table1.Contract = CMC.contract AND Table1.attribute = 'SomeThing'
    LEFT OUTER JOIN TestDB.dbo.ATRIBUTE TheRealPrefix ON TheRealPrefix.Contract = CMC.contract AND TheRealPrefix.attribute = 'SomeOtherPrefix'
where secretCode = 'Mistery'

Я хотел бы передать этот запрос в другой запрос выбора, который использует оператор like с результатами из уже описанный запрос.

Примерно так:

    select from taskTable where task like ('%' + select Table1.valstring Prefix
    from TestDB.dbo.SomeCompany PC
        INNER JOIN TestDB.dbo.CMCompany CMC ON PC.companyuid = CMC.companyuid
        LEFT OUTER JOIN TestDB.dbo.ATRIBUTE Table1 ON Table1.Contract = CMC.contract AND Table1.attribute = 'SomeThing'
        LEFT OUTER JOIN TestDB.dbo.ATRIBUTE TheRealPrefix ON TheRealPrefix.Contract = CMC.contract AND TheRealPrefix.attribute = 'SomeOtherPrefix'
    where secretCode = 'Mistery'
)

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Если вам требуется совпадение, то left join s не требуется. Так что удали их. Неясно, откуда взялось secretCode; это должно быть явным.

Последний join на attribute бесполезен - не используется для фильтрации. И secretCode не берется из этой таблицы (вы получите сообщение об ошибке, потому что ссылка не определена).

Итак, я думаю, что это делает то, что вы хотите:

SELECT tt.*
FROM TestDB.dbo.SomeCompany PC JOIN
     TestDB.dbo.CMCompany CMC 
     ON PC.companyuid = CMC.companyuid JOIN
     TestDB.dbo.ATRIBUTE a
     ON a.Contract = CMC.contract AND a.attribute = 'SomeThing' JOIN
     taskTable tt
     ON task like CONCAT('%', a.valstring)
WHERE secretCode = 'Mistery'
0 голосов
/ 07 мая 2020

Попробуйте использовать этот запрос:

select *
from TestDB.dbo.SomeCompany PC
    INNER JOIN TestDB.dbo.CMCompany CMC ON PC.companyuid = CMC.companyuid
    LEFT JOIN TestDB.dbo.ATRIBUTE Table1 ON Table1.Contract = CMC.contract AND Table1.attribute = 'SomeThing'
    LEFT JOIN TestDB.dbo.ATRIBUTE TheRealPrefix ON TheRealPrefix.Contract = CMC.contract AND TheRealPrefix.attribute = 'SomeOtherPrefix'
    LEFT JOIN taskTable ON taskTable.task LIKE '%' + Table1.valstring
 where secretCode = 'Mistery'

Но имейте в виду, если у вас много строк в вашей БД, поиск по '%' + Table1.valstring - плохая практика .

...