如何删除联合表与连接表之间的匹配项
How to remove matches between unioned tables with joined tables
我有 2 Table
电子邮件和字段
emails 只是一个电子邮件列表,它们的唯一标识符和字段采用第五范式(我认为),带有一列值(第二列中的 ID 数据)、一个数据列和 link 到第一个 table.
中的 uuid
例如:
Table 1:
ID EMAIL
-- -----
1a2 Test@Test
2a3 email@email|
3a4 add@add
Table 2:
value Data ID
----- ------ ---
1 123 Main 1a2
2 John Smith 1a2
3 US 1a2
4 555-555-5555 1a2
在这种情况下,table 2 仅显示“1a2”的数据,因为他们是唯一填写这些数据的人。
所以我正在尝试制作一个 table,它将电子邮件与相应的国家代码结合起来,并且还提供未注册国家代码的电子邮件作为 Null 值
我尝试使用 UNION 在 Table 2 上显示来自 Table 1 的所有电子邮件,在加入 ID 上的 table 1 和 2 之后,然后使用 where 作为值,但是显示所有具有正确国家代码的电子邮件,然后在 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
总之,说了算了。我正在寻找一个 table 看起来像这样没有重复的
EMAIL COUNTRY CODE
----- ------------
test@test US
email@email NULL
add@add NULL
您可以尝试使用 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
您正在以键值格式存储您的用户元数据。这里的一种方法是将用户 table 左连接到一个子查询,该子查询以查找国家/地区为中心:
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;
您可以将您感兴趣的字段作为您的 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
具有该字段值的用户将return它。没有的用户将只是 NULL,因为它是 LEFT 连接。
如果您想对字段值执行条件,那么您还需要检查是否为 null。
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'
好吧,在 post 解决这个问题后我觉得很傻,但我找到了解决方案并打算 post 以防其他人遇到这个问题。
left join
fields f
ON e.id = f.id
where
f.value = '3' OR f.value is null
[[and f.data like concat({{CountryCode}},'%')]]
我只需要为空值添加一个 "OR"。对不起,如果我浪费了任何人的时间,我显然把事情复杂化了,并且在没有工会的情况下设法实现了我想要做的事情。
我有 2 Table
电子邮件和字段
emails 只是一个电子邮件列表,它们的唯一标识符和字段采用第五范式(我认为),带有一列值(第二列中的 ID 数据)、一个数据列和 link 到第一个 table.
中的 uuid例如:
Table 1:
ID EMAIL
-- -----
1a2 Test@Test
2a3 email@email|
3a4 add@add
Table 2:
value Data ID
----- ------ ---
1 123 Main 1a2
2 John Smith 1a2
3 US 1a2
4 555-555-5555 1a2
在这种情况下,table 2 仅显示“1a2”的数据,因为他们是唯一填写这些数据的人。
所以我正在尝试制作一个 table,它将电子邮件与相应的国家代码结合起来,并且还提供未注册国家代码的电子邮件作为 Null 值
我尝试使用 UNION 在 Table 2 上显示来自 Table 1 的所有电子邮件,在加入 ID 上的 table 1 和 2 之后,然后使用 where 作为值,但是显示所有具有正确国家代码的电子邮件,然后在 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
总之,说了算了。我正在寻找一个 table 看起来像这样没有重复的
EMAIL COUNTRY CODE
----- ------------
test@test US
email@email NULL
add@add NULL
您可以尝试使用 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
您正在以键值格式存储您的用户元数据。这里的一种方法是将用户 table 左连接到一个子查询,该子查询以查找国家/地区为中心:
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;
您可以将您感兴趣的字段作为您的 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
具有该字段值的用户将return它。没有的用户将只是 NULL,因为它是 LEFT 连接。
如果您想对字段值执行条件,那么您还需要检查是否为 null。
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'
好吧,在 post 解决这个问题后我觉得很傻,但我找到了解决方案并打算 post 以防其他人遇到这个问题。
left join
fields f
ON e.id = f.id
where
f.value = '3' OR f.value is null
[[and f.data like concat({{CountryCode}},'%')]]
我只需要为空值添加一个 "OR"。对不起,如果我浪费了任何人的时间,我显然把事情复杂化了,并且在没有工会的情况下设法实现了我想要做的事情。