Как удалить совпадения между объединенными таблицами с объединенными таблицами - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть 2 таблицы

электронные письма и поля

электронные письма - это просто список электронных писем, а их уникальные идентификаторы и поля представлены в пятой нормальной форме (я думаю) со столбцом значений (данные идентификатора во втором столбце), столбец данных и идентификаторы, которые ссылаются на идентификаторы в первой таблице.

Например:

Таблица 1:

ID    EMAIL    
--    -----  
1a2  Test@Test   
2a3   email@email|
3a4   add@add    

Таблица 2:

value     Data        ID 
-----    ------       ---
 1       123 Main     1a2
 2      John Smith    1a2
 3         US         1a2  
 4     555-555-5555   1a2  

В этом случае в таблице 2 показаны только данные для «1a2», поскольку они были единственными, которые их заполнили.

Поэтому я пытаюсьчтобы создать таблицу, которая связывает электронную почту с соответствующими кодами стран И также предоставляет электронные письма, которые не зарегистрировали коды стран в качестве значения Null

Я пытался использовать UNION для отображения всех электронных писем из таблицы 1 наТаблица 2 после объединения таблицы 1 и 2 по идентификатору, а затем с использованием где для значения, но в ней показаны все электронные письма, которые имеют правильный код страны, а затем дублируют их также в части UNIONed.

Это примериз того, что я получаю:

EMAIL        COUNTRY CODE
-----        ------------
test@test        US
test@test        NULL
email@email      NULL
add@add          NULL

Вы заметите, что test @ test дублирован из-за того, что у объединения нет нужного фильтра

Мой код выглядит так:

select
    e.email as "Email",
    f.value as "Country Code"
from
    email e
join
    fields f
    ON e.id = f.id
where
    f.value = '3'
    [[and f.data like concat({{CountryCode}},'%')]]   
    -- curly brackets are for user entered variables

В любом случае, все сказанои сделано.Я ищу таблицу, которая выглядит примерно так без No Duplicates

EMAIL        COUNTRY CODE
-----        ------------
test@test        US
email@email      NULL
add@add          NULL

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

Ну, я чувствую себя довольно глупо после публикации этого сообщения, но я нашел решение и собираюсь опубликовать его на случай, если кто-то еще столкнется с проблемой.

left join
    fields f
    ON e.id = f.id
where
    f.value = '3' OR f.value is null
    [[and f.data like concat({{CountryCode}},'%')]]

Мне просто нужно было добавить "ИЛИ"для нулевых значений.Извините, если я потратил впустую чье-то время, я явно слишком усложнял вещи и сумел добиться того, что я пытался сделать, без союза вообще.

0 голосов
/ 14 февраля 2019

Вы храните свои метаданные пользователя в формате значения ключа.Один из подходов здесь - присоединить пользовательскую таблицу слева к подзапросу, который поворачивается, чтобы найти страну:

SELECT
    e.EMAIL,
    f.country_code
FROM email e
LEFT JOIN
(
    SELECT ID, MAX(CASE WHEN value = 3 THEN Data END) AS country_code
    FROM fields
    GROUP BY ID
) f
    ON e.ID = f.ID;

enter image description here

Demo

0 голосов
/ 14 февраля 2019

Вы можете сделать интересующее вас поле частью вашего условия LEFT JOIN.

SELECT
    e.EMAIL,
    f.data as countryCode
FROM email e
LEFT JOIN fields f ON f.value=3 AND e.ID=f.ID

Пользователи со значением для этого поля вернут его.Пользователи без NULL просто будут иметь значение NULL, так как это LEFT-соединение.

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

SELECT
    e.EMAIL,
    f.data as countryCode
FROM email e
LEFT JOIN fields f ON f.value=3 AND e.ID=f.ID
WHERE
    f.data IS NULL 
    OR f.data='US'
0 голосов
/ 14 февраля 2019

Вы можете попробовать использовать max() агрегацию и группировать по -

select
    e.email as "Email",
    max(f.value) as "Country Code"
from
    email e
left join
    fields f
    ON e.id = f.id
where
    f.value = '3'
    [[and f.data like concat({{CountryCode}},'%')]]   
group by  e.email
...