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;
我有一个包含 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;