MainAccountID 是一棵树的根,该树可以有许多帐户,每个帐户可以有许多城市节点,每个子城市节点可以有许多城市。
有一个表ConfigFlow.tb,其中每个条目代表特定的流信息,需要使用包含和排除城市Id来创建
ConfigFlow.tb
MainAccountID,IncludeMainCityId,ExcludeMainCityId
1100,100,200
1200,200,300
AccountIds.tb
AccountId,MainAccountID
1,1100
2,1100
3,1200
城市 ID.tb
CityId,MainCityId
11,100
12,100
13,200
14,300
将 ConfigFlow.tb 与 AccountIds.tb(在 MainAccountID 上)内连接以获取所有子帐户节点,然后与 CityIds.tb 内连接以获取 IncludeMainCityId 下的所有 Cityid
Output only for IncludeMainCityId
1100,100,200, 1,1100, 11,100
1100,100,200, 2,1100, 12,100
1200,200,300, 3,1200, 13,200
有没有办法编写sql查询来同时获取 IncludeMainCityId,ExcludeMainCityId 的输出,像这样?
{ConfigFlow.tb} {AccountIds.tb} {IncludeCityIds} {ExcludeCityIds}
1100,100,200, 1,1100, 11,100 0,0
1100,100,200, 2,1100, 12,100 0,0
1200,200,300, 3,1200, 13,200 0,0
1100,100,200, 1,1100, 0,0 13,200
1200,200,300, 3,1200, 0,0, 14,300
Note:
没有提到所有列名称,但提到了表名称(只是为了避免编写太多有问题的列,但每个逗号分隔都是提到的特定表的一个列)
您可以通过
JOIN
IncludeMainCityId
表格,然后通过 UNION ALL
再次使用 JOIN
和 ExcludeMainCityId
表格:
SELECT cf.*,
a.AccountId,
ic.CityId AS IncludeCityId,
ic.MainCityId AS IncludeMainCityId,
0 AS ExcludeCityId,
0 AS ExcludeMainCityId
FROM configflow cf
INNER JOIN accountids a
ON cf.mainaccountid = a.mainaccountid
INNER JOIN cityids ic
ON cf.IncludeMainCityId = ic.MainCityId
UNION ALL
SELECT cf.*,
a.AccountId,
0,
0,
ec.CityId,
ec.MainCityId
FROM configflow cf
INNER JOIN accountids a
ON cf.mainaccountid = a.mainaccountid
INNER JOIN cityids ec
ON cf.ExcludeMainCityId = ec.MainCityId;
对于样本数据:
CREATE TABLE ConfigFlow (MainAccountID,IncludeMainCityId,ExcludeMainCityId) AS
SELECT 1100,100,200 FROM DUAL UNION ALL
SELECT 1200,200,300 FROM DUAL;
CREATE TABLE AccountIds (AccountId,MainAccountID) AS
SELECT 1,1100 FROM DUAL UNION ALL
SELECT 2,1100 FROM DUAL UNION ALL
SELECT 3,1200 FROM DUAL;
CREATE TABLE CityIds (CityId,MainCityId) AS
SELECT 11,100 FROM DUAL UNION ALL
SELECT 12,100 FROM DUAL UNION ALL
SELECT 13,200 FROM DUAL UNION ALL
SELECT 14,300 FROM DUAL;
输出:
主帐户ID | 包括城市 ID | 排除EMANCITYID | 账号 | 包含城市ID | 包括城市 ID | 排除城市ID | 排除EMANCITYID |
---|---|---|---|---|---|---|---|
1100 | 100 | 200 | 1 | 11 | 100 | 0 | 0 |
1100 | 100 | 200 | 2 | 11 | 100 | 0 | 0 |
1100 | 100 | 200 | 1 | 12 | 100 | 0 | 0 |
1100 | 100 | 200 | 2 | 12 | 100 | 0 | 0 |
1200 | 200 | 300 | 3 | 13 | 200 | 0 | 0 |
1100 | 100 | 200 | 1 | 0 | 0 | 13 | 200 |
1100 | 100 | 200 | 2 | 0 | 0 | 13 | 200 |
1200 | 200 | 300 | 3 | 0 | 0 | 14 | 300 |