0

我认为这应该很容易,但它在逃避我。我在帐户和帐户组之间建立了多对多的关系。一个帐户可以在零个或多个组中,所以我使用标准连接表。

Accounts 
--------
ID
BankName
AcctNumber
Balance

AccountGroups
-------------
ID
GroupName

JoinAccountsGroups
------------------
AID
GID

我正在使用 MS Access,FWIW。此外,这适用于低带宽情况,因此代码优化不如简单/可读性重要。

我使用 php 作为表示层,所以 Access 的基本结果很好。

至于如何处理多结果情况,我实际上有两件事我正在尝试构建。第一个在一个列中列出了所有组,因此:

Bank       AcctNum       Balance    Groups
--------|--------------|----------|----------------
Citi       930938        400        Payroll
HSBC       8372933       100        Monthly, Payroll
Wells      09837         800        -
Chase      8730923       250        Monthly

第二个是主从列表:

Name          AcctNum    Balance
------------|----------|----------
Payroll (2)              500
  Citi        930938     400
  HSBC        8372933    100         
..................................
Monthly (2)              350
  HSBC        8372933    100         
  Chase       8730923    250
..................................
Wells         09837      800

对于主从细节,我的计划只是从数据库中获得一个大的结果集,并根据需要在 php 中调整它。由于无论如何都会在 php 中进行一些重要的后处理,也许我应该只做三个单独的查询并在那里进行连接。(因为我更喜欢那种语言。)

4

9 回答 9

1

SELECT a.BankName, a.AcctNumber, a.Balance, ag.GroupName
FROM (Accounts a 
      LEFT JOIN JoinAccountsGroups jag 
      ON a.ID = jag.AID) 
      LEFT JOIN AccountGroups ag
      ON jag.GID = ag.GroupName;

将为第一个表选择数据,但是要连接组(每月、工资单),您需要一个用户定义的函数 (UDF),Jet 无法使用该函数,因此需要在 PHP 中进行处理。

您可能希望阅读了解 SQL 连接。它指的是 MySQL,但在大多数情况下适用于 Jet。

于 2009-01-23T20:34:37.410 回答
1

另一个想法...为什么不在 Access 中使用查询设计器。设计“视图”大约需要 30 秒。然后去看看它写的SQL。

于 2009-01-23T21:21:11.760 回答
0
SELECT act.acctid AS AcctId, bankName, acctNumber, Balance, 
       NVL(jag.gid, '-') AS GroupID, NVL(gp.groupname, '-') AS GroupName
FROM accounts act 
     LEFT OUTER JOIN JointAccountGroups jag ON (act.id = jag.aid) 
     LEFT OUTER JOIN AccounGroups gp ON (jag.gid = gp.id)

NVL 是一个函数,意思是“如果第一个参数为空,则返回第二个参数;否则,返回第一个参数”。NVL 恰好是 Oracle 的做法——所有数据库都有类似的东西,但它没有标准名称;查看 Access 是如何做到的。

于 2009-01-23T16:54:04.953 回答
0

SQL Server 为此目的使用 ISNULL()。我不确定这是否适用于 Access。

于 2009-01-23T16:57:34.557 回答
0

是的,我将使用表示层作为 NULL。

但我一定是错过了什么。我从您那里得到的错误与我最初的尝试相同:

Syntax error (missing operator) in query expression '(act.id = jag.aid) 
                  LEFT OUTER JOIN accountgroups gp ON (jag.gid = gp.id)'
于 2009-01-23T17:04:22.700 回答
0

怎么样:

SELECT act.acctid AS AcctId, bankName, acctNumber, Balance, 
      jag.gid AS GroupID, gp.groupname AS GroupName
FROM accounts AS act 
     LEFT OUTER JOIN JointAccountGroups AS jag ON act.id = jag.aid
     LEFT OUTER JOIN AccounGroups AS gp ON jag.gid = gp.id

这会给你一个错误吗?一个更容易弄清楚的错误?

于 2009-01-23T17:12:54.523 回答
0

我认为在 Access 中您可能想尝试以下操作:

FROM (accounts AS act 
     LEFT OUTER JOIN JointAccountGroups AS jag ON act.id = jag.aid)
     LEFT OUTER JOIN AccounGroups AS gp ON jag.gid = gp.id

我不知道为什么括号很重要,但我尝试了一个测试,它似乎解决了它。

于 2009-01-23T19:43:04.517 回答
0

另一个尝试:

SELECT act.acctid AS AcctId, bankName, acctNumber, Balance, 
    jag.gid AS GroupID, gp.groupname AS GroupName
FROM accounts AS act 
   LEFT OUTER JOIN JointAccountGroups AS jag ON act.id = jag.aid
   LEFT INNER JOIN AccounGroups AS gp ON jag.gid = gp.id

两个 OUTER JOIN 的访问可能有问题,所以我将第二个设置为 INNER JOIN,它应该可以工作

于 2009-01-23T21:19:28.457 回答
0

不仅使用前面建议的查询设计器,还要使用 MS Access 关系工具来记录两个外键(AID、GID)和它们引用的主键之间的关系。

这使得在查询设计器中进行自然连接几乎是小菜一碟。您甚至可以在您概述的情况下使用查询向导。

建立查询后,为什么不使用查询作为记录源而不是使用表呢?

我会在 PHP 中做的一件事是将多个结果转换为逗号分隔的列表。

于 2009-01-25T14:13:32.537 回答