Запрос, чтобы найти электронные письма от SELECT FROM VALUES - PullRequest
0 голосов
/ 10 апреля 2020

У меня проблема с запросом, который должен вернуть только указанный набор результатов c, однако он возвращает все значения. По сути, я пытаюсь обновить столбец электронной почты в одной таблице значениями из списка из другой, внутренний запрос работает так, что я могу получить правильные имена / фамилии, но внешний запрос возвращает все электронные письма, и я только Я хочу, чтобы письма из перечисленных значений.

SELECT DISTINCT WorkEmail FROM stafftbl WHERE EXISTS  (
SELECT DISTINCT FirstName,LastName -- inner query starts here
FROM assignments
WHERE Email IN  
(SELECT email 
 FROM 
    (VALUES 
    ('josh@myjob.org'),
    ('pete@myjob.org'),
    ('willy@myjob.org'),
    ('linda@myjob.org'),
    ('mary@myjob.org'),
    ('james@myjob.org'),
    ('ahmed@myjob.org'),
    ('horatio@myjob.org'),
    ('luke@myjob.org'),
    ('terri@myjob.org'),
    ('chuck@myjob.org'),
    ('betty@myjob.org'),
    ('bigbob@myjob.org'),
    ('arthur@myjob.org'),
    ('Ajessica@myjob.org') -- there's a lot more than these.
)E(email))                 -- inner query ends here
)

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

РЕДАКТИРОВАТЬ:

Да, есть дубликаты в assignments, и WorkEmail не соответствует всей электронной почте! Я обновлю столбец электронной почты assignments, если смогу получить из списка соответствующие электронные письма, которые будут совпадать с именами / фамилиями в таблице stafftbl.

1 Ответ

0 голосов
/ 10 апреля 2020

I подозреваю , что в подзапросе отсутствует условие корреляции. Без него внешний запрос возвращает все строки из stafftbl, как только в любой строке в assignments появится электронное письмо, которое можно найти в списке.

SELECT DISTINCT WorkEmail 
FROM stafftbl s 
WHERE EXISTS  (
    SELECT 1
    FROM assignments a
    WHERE 
        a.Email = s.WorkEmail     -- correlation to the outer query
        AND a.Email IN  (
            SELECT email 
            FROM (VALUES 
                ('josh@myjob.org'),
                ('pete@myjob.org'),
                ('willy@myjob.org'),
                ('linda@myjob.org'),
                ('mary@myjob.org'),
                ('james@myjob.org'),
                ('ahmed@myjob.org'),
                ('horatio@myjob.org'),
                ('luke@myjob.org'),
                ('terri@myjob.org'),
                ('chuck@myjob.org'),
                ('betty@myjob.org'),
                ('bigbob@myjob.org'),
                ('arthur@myjob.org'),
                ('Ajessica@myjob.org')
            ) E(email)
        )
)

Примечание 1: нет необходимости используйте DISTINCT и для возврата указанных c столбцов из подзапроса EXISTS. Это выражение предназначено для проверки, возвращает ли подзапрос некоторую запись , и результаты в основном отбрасываются. Я изменил его на SELECT 1.

Примечание 2. Я также подозреваю, что вам не нужно DISTINCT во внешнем запросе (если в stafftbl.

нет дублирующихся писем). Примечание 3: как ваш запрос, использование конструктора таблицы VALUES() в подзапросе не требуется. Вы можете просто использовать IN, как:

AND a.Email IN  ('josh@myjob.org', 'pete@myjob.org', ...)
...