Select 单个 table 数据与 1:Many 关系

Select data in single table with a 1:Many relationship

我有一个包含 67 列和大约 36,000 行的 table,我需要 运行 基于其中两列的 SELECT。

重要的列是FINANCIAL_ACCOUNT_ID、EVENT_DESCRIPTION。

FINANCIAL_ACCOUNT_ID 是每个帐户的唯一编号,但在 table 中可能不是唯一的。事件描述不是唯一的。事件描述可以包含'Event 1''Event 2''Event 3'等。

所以 table 看起来像这样:

TABLE
+----------------------+-------------------+-------------+
| FINANCIAL_ACCOUNT_ID | EVENT_DESCRIPTION | OTHER_STUFF |
+----------------------+-------------------+-------------+
|  1121                |   Event 1         |     n/a     |
|  107401              |   Event 2         |     n/a     |
|  256483              |   Event 1         |     n/a     |
|  1121                |   Event 3         |     n/a     |
|  107401              |   Event 1         |     n/a     |
|  363586              |   Event 1         |     n/a     |
|  546875              |   Event 1         |     n/a     |
|  546875              |   Event 2         |     n/a     |
+----------------------+-------------------+-------------+


RESULT
+----------------------+-------------------+-------------+
| FINANCIAL_ACCOUNT_ID | EVENT_DESCRIPTION | OTHER_STUFF |
+----------------------+-------------------+-------------+
|  107401              |   Event 2         |     n/a     |
|  107401              |   Event 1         |     n/a     |
|  546875              |   Event 1         |     n/a     |
|  546875              |   Event 2         |     n/a     |
+----------------------+-------------------+-------------+

我需要返回的是整行,如果有一个金融账户 ID 同时包含 'Event 1' 和 'Event 2'。

我试过将 WITH 子句与内部联接结合使用...在我最近的尝试中,我添加了一个计数 (financial_account_id),例如:

 select FINANCIAL_ACCOUNT_ID, EVENT_DESCRIPTION, COUNT(FINANCIAL_ACCOUNT_ID)
 FROM master 
 group by FINANCIAL_ACCOUNT_ID 
 HAVING COUNT(FINANCIAL_ACCOUNT_ID) >1;

但是,这是我在 select 语句中看到的结果:

Financial_Account_ID | Event_Description | COUNT(Financial_Account_ID)
      107401         |      Event 2      |         2
      546875         |      Event 1      |         2    

(我说我需要整行,但是一旦我得到正确的返回结果,我就可以过滤掉我不需要的无关列。)

对于像这样的 SQL 查询应该是什么样子有什么帮助吗? 详细信息:mariadb 10,数据库名称:JuneEvents,table 名称:master 我在 MS-SQL 2012 Express db

中也有一份副本

编辑:@Tim - 很抱歉,我需要将每个帐户与 'event 1' 和 'event 2' 投掷事件 3 以及可能存在的任何其他事件相匹配。这说明了吗?

解决方案: 我使用@Gordon 的第二个查询和 JOIN 作为起点,最终得到如下所示的最终查询:(注意:现在有一些额外的字段,但我在初始查询返回正确的结果后添加了它们初始数据集。)

SELECT t.financial_account_id, t.event_description, t.sold_quantity, t.paid_amount
FROM master t JOIN
     (SELECT financial_account_id
      FROM master t
      WHERE event_description IN ('Event 1', 'Event 2') 
      GROUP BY financial_account_id
      HAVING COUNT(DISTINCT event_description) = 2
     ) tt
     ON tt.financial_account_id = t.financial_account_id
     WHERE (event_description IN ('Event 1', 'Event 2') AND (sold_quantity > 0));

以下查询将生成所有 FINANCIAL_ACCOUNT_ID,其中包含 'Event 1''Event 2',并且 这两个事件。如果您想提取其他信息,可以轻松地将此结果加入另一个 table.

SELECT FINANCIAL_ACCOUNT_ID,
    SUM(CASE WHEN EVENT_DESCRIPTION IN ('Event 1', 'Event 2') THEN 1 ELSE 0 END) AS eventCount
FROM yourTable
GROUP BY FINANCIAL_ACCOUNT_ID
HAVING eventCount = 2 AND COUNT(*) = 2

要获取包含这两个事件的帐户,请使用:

SELECT financial_account_id
FROM master t
WHERE event_description IN ('Event 1', 'Event 2')
GROUP BY financial_account_id
HAVING COUNT(DISTINCT event_description) = 2;

然后要获取原始行,请使用 JOIN:

SELECT t.*
FROM master t JOIN
     (SELECT financial_account_id
      FROM master t
      WHERE event_description IN ('Event 1', 'Event 2')
      GROUP BY financial_account_id
      HAVING COUNT(DISTINCT event_description) = 2
     ) tt
     ON tt.financial_account_id = t.financial_account_id;