SQL для выбора записей, в которых оба значения в одной таблице представлены как подстроки в текстовом поле во второй таблице - PullRequest
0 голосов
/ 27 июня 2019
TableOne:    LNAME      FNAME     FILETYPE
             Smith      John      A
             Jones      Mary      B
             Brown      James     B

TableTwo:    NAME                 FILETYPE
             Mary Smith           1
             Smith, Mary Jane     2
             Brown, James         3

Хитрый, чтобы объяснить.

У меня есть две таблицы (не огромные - несколько тысяч записей).Соответствующие поля находятся в примере выше.То, что мне нужно вытащить, было бы алгоритмически:

SELECT
    TableOne.LName, TableOne.FName, TableOne.FileType, TableTwo.Name
WHERE
    (TableTwo.Name LIKE *LName* AND TableTwo.name LIKE *FName*)
    AND
    (IF TableOne FileType = 'A' THEN
        TableTwo.FileType = '1'
     ELSE IF TableOne FileType = 'B' THEN
        TableTwo.FileType = '2' OR TableTwo.FileType = '3'
    )

Очевидно, что это не решение, а просто неуклюжий тип psuedocode.Я не опубликовал ни одной из моих попыток за последние пару часов, потому что они даже близко не подошли (они включали временные таблицы и подзапросы).

Я знаю, что это никогда не приведет кбыть на 100% точным - в этом поле ИМЯ слишком много опечаток, чтобы начать с него - мне просто нужно найти отправную точку на основе записей, где есть разумный шанс, что в TableTwo нет записи, совпадающей с TableOne.

Я испытываю желание сдаться и просто выполнить работу на Python (я хотел бы подумать, что мог бы сделать это за то время, которое требуется, чтобы напечатать это), но я хотел бы посмотреть, может ли этобыть сделано в SQL

Ответы [ 3 ]

4 голосов
/ 27 июня 2019

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

SELECT
    t1.LName,
    t1.FName,
    t1.FileType,
    t2.Name
FROM TableOne t1
INNER JOIN TableTwo t2
    ON PATINDEX('%' + t1.FName + '%', t2.Name) > 0 AND
       PATINDEX('%' + t1.LName + '%', t2.Name) > 0
WHERE
    (t1.FILETYPE = 'A' AND t2.FILETYPE = 1) OR
    (t1.FILETYPE = 'B' AND t2.FILETYPE IN (2, 3));

enter image description here

Демо

1 голос
/ 27 июня 2019

Я обычно предпочитаю соблюдать условия JOIN в предложении ON и не использовать CASE для логических выражений.

Итак:

SELECT t1.LName, t1.FName, t1.FileType, t2.Name
FROM TableOne t1 JOIN
     TableTwo t2
     ON t2.Name LIKE '%' + LName + '%' AND  
        t2.name LIKE '%' + FName + '%' AND
        ((t1.FileType = 'A' AND t2.FileType = 1) OR
         (t1.FileType = 'B' AND t2.FileType IN (2, 3))
        );
1 голос
/ 27 июня 2019

Попробуйте:

SELECT
    t1.LName,
    t1.FName,
    t1.FileType,
    t2.Name
FROM TableOne t1
JOIN TableTwo t2 ON
    t2.NAME LIKE '%'+t1.LNAME+'%' AND
    t2.NAME LIKE '%'+t1.FNAME+'%' AND
    t1.FILETYPE = CASE WHEN t2.FILETYPE = 1 THEN 'A' ELSE 'B' END

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...