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)