SQL Могу ли я иметь IN или CONTAINS в предложении JOIN? - PullRequest
0 голосов
/ 25 сентября 2019

Я объединяю две таблицы SQL и хочу сделать что-то вроде этого

LEFT JOIN uscities Ci 
        ON Customer_State = ci.state_id
        -- and Customer_City = ci.city
        and Customer_Zip in ci.zips

Возможно ли это каким-либо образом?

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Вы можете иметь IN в предложении JOIN.Фактически, вы можете иметь любой оператор , который вам нужен.

Однако вы не можете использовать IN для одного поля.На самом деле, вы просто не должны хранить списки вещей внутри строки.Это очень плохое моделирование данных.У вас должна быть отдельная таблица с одной строкой на zip и на сущностьЭто SQLish способ делать вещи.

Тем не менее, я бы порекомендовал string_split():

LEFT JOIN uscities Ci 
ON c.Customer_State = ci.state_id AND
   c.Customer_Zip IN (SELECT value FROM STRING_SPLIT(ci.zips, ' '))
1 голос
/ 25 сентября 2019

Если ci.zips является объединенной строкой всех почтовых индексов, вы можете заглянуть внутрь нее с помощью предложения:

and CHARINDEX(Customer_Zip, ci.zips) > 0
AND Len(Customer_Zip) = 5

Однако это очень неэффективное действие в SQL Server,Было бы гораздо лучше, если бы вы разбили этот список почтовых индексов на таблицу ZipCode, такую ​​как:

CREATE TABLE ZipCodes (
    ZipCode char(5) PRIMARY KEY
    )

Тогда ваше условие будет следующим:

and EXISTS (
    SELECT *
    FROM ZipCodes
    WHERE Customer_Zip = ZipCode
    )

Подробнееэффективный, в целом быстрее.

0 голосов
/ 26 сентября 2019

Как уже отмечали другие, вы можете по существу иметь любой оператор в выражении предложения JOIN ON.Вам просто нужно быть осторожным, чтобы выражение объединения соответствовало только одной строке каждого элемента (таблицы), к которому присоединяются.

Наличие элемента ci.zips в виде строки разделенных пробелами почтовых индексов усложняет ситуацию, но вы можетепо-прежнему ищите (сопоставляйте) конкретный почтовый индекс клиента в нем с помощью простого предложения LIKE:

left join uscities as ci
    on Customer_State = ci.state_id
--  and Customer_City = ci.city
    and ci.zips like '%' + Customer_Zip + '%'

Если строка ci.zips очень длинная, это может быть не так эффективно.

...