SQL 如何 select 来自 table 的单个值与 LEFT JOIN,在 Google Datastudio 中
SQL how to select a single value from a table with LEFT JOIN, In Google Datastudio
我有两个 table,一个 table 叫 mailing_events,一个 table 叫 mailing_outletcontact。我的 table 示例如下。
邮寄table非常简单,没有重复:
+-------+------------+--------------------------+
| id | mailing_id | email |
+-------+------------+--------------------------+
| name1 | 12 | name1.company@gmail.com |
| name2 | 15 | name2@gmail.com |
| name3 | 20 | name3@gmail.com |
+-------+------------+--------------------------+
我的第二个 table“mailing_outletcontact”在电子邮件字段中有重复项。
+----+-------------------------+------------------+--------------+
| id | email | outletcontact_id | email_number |
+----+-------------------------+------------------+--------------+
| 1 | name1.company@gmail.com | 6 | 5 |
| 2 | name1.company@gmail.com | 6 | 6 |
| 3 | name1.company@gmail.com | 6 | 7 |
| 4 | name2@gmail.com | 8 | 8 |
| 5 | name3@gmail.com | 4 | 9 |
| 6 | name2@gmail.com | 8 | 10 |
+----+-------------------------+------------------+--------------+
我正在尝试在 Datastudio 中查询数据库,我的目标是使用我的第一个 table 数据获取“outletcontact_id”字段。
我尝试进行左连接,但是,由于第二个值中有多个值 table 我不得不选择一行进行匹配。对我来说,它匹配哪一行并不重要,我决定选择 id 字段最高的那个。
我的代码是:
SELECT
mailing_events.mailing_id,
mailing_events.email,
new_mailing_outletcontact.outletcontact_id
FROM
mailing_events
LEFT JOIN(
select *
from mailing_outletcontact
where id in(select max(id) from mailing_outletcontact group by email)
) as new_mailing_outletcontact
on mailing_events.email = new_mailing_outletcontact.email;
SELECT
mailing_events.mailing_id,
mailing_events.email,
new_mailing_outletcontact.outletcontact_id
FROM
mailing_events
LEFT JOIN(
select *
from mailing_outletcontact
where id in(select max(id) from mailing_outletcontact group by email)
) as new_mailing_outletcontact
on mailing_events.email = new_mailing_outletcontact.email;
这没有用,有谁知道我哪里出错了。或者如何完全解决我的问题。这是用我的第一个 table 数据获取“outletcontact_id”字段。
编辑:
我是 Datastudio 中的 运行 SQL,所以错误消息不是很好。在线查看后,错误 ID 也没有提供任何值。错误信息是:
The query returned an error.
Error ID: 3ab6a2cd
第二次编辑:
shawnt00 提供的答案确实适用于 SQL 客户端软件,例如 DBeaver。因此,如果您正在阅读本文时遇到类似问题,那应该有所帮助。
它仍然无法在 Datastudio 中使用他们的 SQL 连接,所以他们可能使用不同的标准或其他东西?
如果我没理解错的话,您正在寻找这个:
SELECT
mailing_events.mailing_id,
mailing_events.email,
new_mailing_outletcontact.outletcontact_id
FROM
mailing_events
CROSS JOIN (
select *
from mailing_outletcontact
where mailing_events.email = new_mailing_outletcontact.email
order by mailing_outletcontact.Id DESC
LIMIT 1
) as new_mailing_outletcontact
SELECT
me.mailing_id, me.email,
(
select max(moc.outletcontact_id)
from mailing_outletcontact moc
where moc.email = me.email
) as outletcontact_id
FROM
mailing_events me;
架构和输入语句:
create table mailing_events (id varchar(50), mailing_id int ,email varchar(50))
insert into mailing_events values('name1', 12, 'name1.company@gmail.com');
insert into mailing_events values('name2', 15, 'name2@gmail.com');
insert into mailing_events values('name3', 20, 'name3@gmail.com');
create table mailing_outletcontact( id int,email varchar(50),outletcontact_id int, email_number int);
insert into mailing_outletcontact values(1, 'name1.company@gmail.com' ,6, 5 );
insert into mailing_outletcontact values(2, 'name1.company@gmail.com' ,6, 6 );
insert into mailing_outletcontact values(3, 'name1.company@gmail.com' ,6, 7 );
insert into mailing_outletcontact values(4, 'name2@gmail.com' ,8, 8 );
insert into mailing_outletcontact values(5, 'name3@gmail.com' ,4, 9 );
insert into mailing_outletcontact values(6, 'name2@gmail.com' ,8, 10 );
Query#0 带有 DBeaver 和 Oracle 的子查询
SELECT
me.mailing_id,
me.email,
(select outletcontact_id from mailing_outletcontact mo where mo.email=me.email fetch first 1 rows only) outletcontact_id
FROM
mailing_events me
Query#1 With subquery for Mysql (Limit 1) (This will reuturn first outletcontact_id )
SELECT
me.mailing_id,
me.email,
(select outletcontact_id from mailing_outletcontact mo where mo.email=me.email limit 1) outletcontact_id
FROM
mailing_events me
Query#2 带有 SQL 服务器的子查询(前 1)(这将首先返回 outletcontact_id)
SELECT
me.mailing_id,
me.email,
(select top 1 outletcontact_id from mailing_outletcontact mo where mo.email=me.email) outletcontact_id
FROM
mailing_events me
Output:
mailing_id
email
outletcontact_id
12
name1.company@gmail.com
6
15
name2@gmail.com
8
20
name3@gmail.com
4
Query#3 使用聚合(您可以使用 min() 获得最小值 outletcontact_id 或使用 max() 获得最大值 outletcontact_id )
SELECT
me.mailing_id,
me.email,
(select min(outletcontact_id ) from mailing_outletcontact mo where mo.email=me.email) outletcontact_id
FROM
mailing_events me
GO
输出:
mailing_id
email
outletcontact_id
12
name1.company@gmail.com
6
15
name2@gmail.com
8
20
name3@gmail.com
4
带左连接的查询#4
SELECT
me.mailing_id,
me.email,
t.outletcontact_id
FROM
mailing_events me
Left Join
(select email, min(outletcontact_id )outletcontact_id from mailing_outletcontact group by email
)t
on me.email = t.email
GO
输出:
mailing_id
email
outletcontact_id
12
name1.company@gmail.com
6
15
name2@gmail.com
8
20
name3@gmail.com
4
dbhere
尝试以下方法之一:
SELECT
mailing_events.mailing_id,
mailing_events.email,
new_mailing_outletcontact.outletcontact_id
FROM
mailing_events
LEFT JOIN (
select distinct email, outletcontact_id
from mailing_outletcontact
) as new_mailing_outletcontact
USING (email)
或
SELECT DISTINCT
mailing_events.mailing_id,
mailing_events.email,
mailing_outletcontact.outletcontact_id
FROM mailing_events
LEFT JOIN mailing_outletcontact
USING (email)
我有两个 table,一个 table 叫 mailing_events,一个 table 叫 mailing_outletcontact。我的 table 示例如下。
邮寄table非常简单,没有重复:
+-------+------------+--------------------------+
| id | mailing_id | email |
+-------+------------+--------------------------+
| name1 | 12 | name1.company@gmail.com |
| name2 | 15 | name2@gmail.com |
| name3 | 20 | name3@gmail.com |
+-------+------------+--------------------------+
我的第二个 table“mailing_outletcontact”在电子邮件字段中有重复项。
+----+-------------------------+------------------+--------------+
| id | email | outletcontact_id | email_number |
+----+-------------------------+------------------+--------------+
| 1 | name1.company@gmail.com | 6 | 5 |
| 2 | name1.company@gmail.com | 6 | 6 |
| 3 | name1.company@gmail.com | 6 | 7 |
| 4 | name2@gmail.com | 8 | 8 |
| 5 | name3@gmail.com | 4 | 9 |
| 6 | name2@gmail.com | 8 | 10 |
+----+-------------------------+------------------+--------------+
我正在尝试在 Datastudio 中查询数据库,我的目标是使用我的第一个 table 数据获取“outletcontact_id”字段。
我尝试进行左连接,但是,由于第二个值中有多个值 table 我不得不选择一行进行匹配。对我来说,它匹配哪一行并不重要,我决定选择 id 字段最高的那个。
我的代码是:
SELECT
mailing_events.mailing_id,
mailing_events.email,
new_mailing_outletcontact.outletcontact_id
FROM
mailing_events
LEFT JOIN(
select *
from mailing_outletcontact
where id in(select max(id) from mailing_outletcontact group by email)
) as new_mailing_outletcontact
on mailing_events.email = new_mailing_outletcontact.email;
SELECT
mailing_events.mailing_id,
mailing_events.email,
new_mailing_outletcontact.outletcontact_id
FROM
mailing_events
LEFT JOIN(
select *
from mailing_outletcontact
where id in(select max(id) from mailing_outletcontact group by email)
) as new_mailing_outletcontact
on mailing_events.email = new_mailing_outletcontact.email;
这没有用,有谁知道我哪里出错了。或者如何完全解决我的问题。这是用我的第一个 table 数据获取“outletcontact_id”字段。
编辑: 我是 Datastudio 中的 运行 SQL,所以错误消息不是很好。在线查看后,错误 ID 也没有提供任何值。错误信息是:
The query returned an error.
Error ID: 3ab6a2cd
第二次编辑: shawnt00 提供的答案确实适用于 SQL 客户端软件,例如 DBeaver。因此,如果您正在阅读本文时遇到类似问题,那应该有所帮助。
它仍然无法在 Datastudio 中使用他们的 SQL 连接,所以他们可能使用不同的标准或其他东西?
如果我没理解错的话,您正在寻找这个:
SELECT
mailing_events.mailing_id,
mailing_events.email,
new_mailing_outletcontact.outletcontact_id
FROM
mailing_events
CROSS JOIN (
select *
from mailing_outletcontact
where mailing_events.email = new_mailing_outletcontact.email
order by mailing_outletcontact.Id DESC
LIMIT 1
) as new_mailing_outletcontact
SELECT
me.mailing_id, me.email,
(
select max(moc.outletcontact_id)
from mailing_outletcontact moc
where moc.email = me.email
) as outletcontact_id
FROM
mailing_events me;
架构和输入语句:
create table mailing_events (id varchar(50), mailing_id int ,email varchar(50))
insert into mailing_events values('name1', 12, 'name1.company@gmail.com');
insert into mailing_events values('name2', 15, 'name2@gmail.com');
insert into mailing_events values('name3', 20, 'name3@gmail.com');
create table mailing_outletcontact( id int,email varchar(50),outletcontact_id int, email_number int);
insert into mailing_outletcontact values(1, 'name1.company@gmail.com' ,6, 5 );
insert into mailing_outletcontact values(2, 'name1.company@gmail.com' ,6, 6 );
insert into mailing_outletcontact values(3, 'name1.company@gmail.com' ,6, 7 );
insert into mailing_outletcontact values(4, 'name2@gmail.com' ,8, 8 );
insert into mailing_outletcontact values(5, 'name3@gmail.com' ,4, 9 );
insert into mailing_outletcontact values(6, 'name2@gmail.com' ,8, 10 );
Query#0 带有 DBeaver 和 Oracle 的子查询
SELECT
me.mailing_id,
me.email,
(select outletcontact_id from mailing_outletcontact mo where mo.email=me.email fetch first 1 rows only) outletcontact_id
FROM
mailing_events me
Query#1 With subquery for Mysql (Limit 1) (This will reuturn first outletcontact_id )
SELECT
me.mailing_id,
me.email,
(select outletcontact_id from mailing_outletcontact mo where mo.email=me.email limit 1) outletcontact_id
FROM
mailing_events me
Query#2 带有 SQL 服务器的子查询(前 1)(这将首先返回 outletcontact_id)
SELECT
me.mailing_id,
me.email,
(select top 1 outletcontact_id from mailing_outletcontact mo where mo.email=me.email) outletcontact_id
FROM
mailing_events me
Output:
mailing_id | outletcontact_id | |
---|---|---|
12 | name1.company@gmail.com | 6 |
15 | name2@gmail.com | 8 |
20 | name3@gmail.com | 4 |
Query#3 使用聚合(您可以使用 min() 获得最小值 outletcontact_id 或使用 max() 获得最大值 outletcontact_id )
SELECT
me.mailing_id,
me.email,
(select min(outletcontact_id ) from mailing_outletcontact mo where mo.email=me.email) outletcontact_id
FROM
mailing_events me
GO
输出:
mailing_id | outletcontact_id | |
---|---|---|
12 | name1.company@gmail.com | 6 |
15 | name2@gmail.com | 8 |
20 | name3@gmail.com | 4 |
带左连接的查询#4
SELECT
me.mailing_id,
me.email,
t.outletcontact_id
FROM
mailing_events me
Left Join
(select email, min(outletcontact_id )outletcontact_id from mailing_outletcontact group by email
)t
on me.email = t.email
GO
输出:
mailing_id | outletcontact_id | |
---|---|---|
12 | name1.company@gmail.com | 6 |
15 | name2@gmail.com | 8 |
20 | name3@gmail.com | 4 |
db
尝试以下方法之一:
SELECT
mailing_events.mailing_id,
mailing_events.email,
new_mailing_outletcontact.outletcontact_id
FROM
mailing_events
LEFT JOIN (
select distinct email, outletcontact_id
from mailing_outletcontact
) as new_mailing_outletcontact
USING (email)
或
SELECT DISTINCT
mailing_events.mailing_id,
mailing_events.email,
mailing_outletcontact.outletcontact_id
FROM mailing_events
LEFT JOIN mailing_outletcontact
USING (email)