0

所以我不确定我是否采取了正确的方法,但这就是我所追求的:我需要从表 A 中获取所有记录

然后加入表 B 并连接与表中特定 ID 匹配的所有值。

我在下面的查询中注意到的是,我只得到表 B 中有记录的结果 - 如果表 A 中没有相应的值,我希望能够在我的结果集中显示一个 NULL 值

SELECT Account.AccountID, AccountOpenedDate, AccountStatus, GROUP_CONCAT(Expense.ExpenseType SEPARATOR ':') AS Expense FROM Account
    JOIN Expense ON Account.AccountID=Expense.AccountID
    GROUP BY MONTH(DATE(AccountOpenedDate)), Account.AccountID
    ORDER BY Account.AccountID ASC;

我想返回所有帐户和帐户状态以及打开日期然后如果 Expense 具有该行的值,则显示那些与“:”连接的值作为分隔符。

我似乎只在两个表中都存在记录的情况下得到结果。

4

1 回答 1

0

您正在描述一个left join

select 
    a.accountID, 
    a.accountOpenedDate, 
    a.accountStatus, 
    group_concat(e.expenseType separator ':') as expense 
from account a
left join expense e on e.accountID = a.accountID
group by a.accountID
order by a.accountID

我也没有看到子句中表达MONTH(DATE(AccountOpenedDate))的意义GROUP BY:您似乎希望每个帐户有一行,所以这似乎无关紧要。

accountID上述查询是在 table 的主键假设下工作的account:同一列中的其他列在功能上依赖于主键,因此您不需要在group by子句中列出它们。你也可以这样写:

select 
    a.accountID, 
    a.accountOpenedDate, 
    a.accountStatus, 
    group_concat(e.expenseType separator ':') as expense 
from account a
left join expense e on e.accountID = a.accountID
group by a.accountID, a.accountOpenedDate, a.accountStatus
order by a.accountID

旁注:

  • 表别名使查询更易于编写和阅读

  • 在多表查询中,所有列都应使用它们所属的表(别名)进行限定(前缀)

于 2020-07-15T01:15:59.140 回答