【问题标题】:In SQL Query a one-to-many relationship with condition在 SQL 查询中与条件的一对多关系
【发布时间】:2017-08-07 19:25:09
【问题描述】:

我有以下表格:

event_tbl

| event_id (PK) | event_date | event_location |
|---------------|------------|----------------|
| 1             | 01/01/2018 | Miami          |                
| 2             | 02/04/2018 | Tampa          |                    

performer_tbl

| performer_id (PK) | event_id (FK) | genre |
|-------------------|---------------|-------|
| 1                 | 1             |  A    |
| 2                 | 1             |  B    |
| 3                 | 2             |  A    |
| 4                 | 2             |  C    |

我想查找同时具有类型 A 和类型 B 的事件(应该只返回事件 1),而我在编写查询时迷失了方向。也许我只是没有喝足够的咖啡,但我能想出的只是做两个派生列,其中包含一个 case 语句,通过 event_id 计算流派和组,然后将两者过滤为 >0。只是看起来不太优雅。

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?

标签: sql one-to-many


【解决方案1】:

这应该可以完成工作(在 MySQL 中,对于其他 DBMS,语法可以很容易地改变):

SELECT
e.event_id
FROM
event_tbl e
JOIN performer_tbl p USING(event_id)
GROUP BY e.event_id
HAVING SUM(IF(p.genre = 'A', 1, 0)) >= 1 AND SUM(IF(p.genre = 'B', 1, 0)) >= 1;

【讨论】:

    【解决方案2】:

    如果您使用的是 sql server,请检查以下内容:

      Select * From 
      event_tbl 
      where event_id 
      IN
      (
      select event_id 
       from performer_tbl as A
      where exists (select 1 
                    from perfoermer_tbl as B 
                    where B.event_id = A.event_id and B.genre = 'A')
            and
            exists (select 1 
                    from perfoermer_tbl as B 
                    where B.event_id = A.event_id and B.genre = 'B')
      )
    

    【讨论】:

      【解决方案3】:

      这应该适用于任何 SQL 数据库(至少在 mysql、sql server、postgres 或 oracle 中)

          select event_tbl.* FROM (
          select event_id
          from performer_tbl
          where genre = 'A'
          GROUP BY event_id) a_t
          INNER JOIN (select event_id
          from performer_tbl
          where genre = 'B'
          GROUP BY event_id) b_t
          ON a_t.event_id = b_t.event_id
          INNER JOIN event_tbl
          ON event_tbl.event_id = a_t.event_id
      

      【讨论】:

        【解决方案4】:

        这也适用于左连接:(因为没有函数调用或子选择,所以速度很快。此外,它适用于大多数 SQL 引擎。)

        SELECT DISTINCT
           p1.event_id
           ,e.event_date
           ,e.event_location
        FROM
           performer_tbl as p1
           inner join event_tbl as e on
              p1.event_id = e.event_id 
           left outer join performer_tbl as p2 on
              p1.event_id = p2.event_id 
              AND p2.genre = 'A'
           left outer join performer_tbl as p3 on
              p1.event_id = p3.event_id 
              AND p3.genre = 'B'
        WHERE
            p2.genre IS NOT NULL
            AND p3.genre IS NOT NULL;
        

        【讨论】:

          【解决方案5】:

          如果我正确理解你的需要,你可以试试这个:

          Select *
            from event_tbl e
           where exists (select *
                           from performer_tbl p
                          where p.event_id = e.event_id
                            and p.genre in ('A', 'B'))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-10-25
            • 1970-01-01
            • 2015-07-23
            • 1970-01-01
            • 2013-11-18
            • 1970-01-01
            • 2022-01-11
            相关资源
            最近更新 更多