簡體   English   中英

基本的多對多SQL選擇查詢

[英]basic many-to-many sql select query

我認為這應該很容易,但是卻在逃避我。 我在帳戶和帳戶組之間建立了多對多關系。 一個帳戶可以在零個或多個組中,因此我使用的是標准聯接表。

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

對於主細節,我的計划是從db中獲得較大的結果集,並根據需要在php中進行修改。 由於無論如何都會在php中進行一些重要的后處理,也許我應該只做三個單獨的查詢並在那里進行連接。 (因為我對這種語言比較滿意。)

這個

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。

另一個想法...為什么不在Access中使用查詢設計器。 設計“視圖”大約需要30秒。 然后去看看它編寫的SQL。

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是一個函數,表示“如果第一個參數為null,則返回第二個參數;否則,返回第一個參數”。 NVL恰好是Oracle的工作方式-所有數據庫都有類似的名稱,但是它沒有標准名稱。 查找Access如何做到的。

SQL Server為此使用ISNULL()。 我不確定在Access中是否可行。

是的,我將使用表示層作為NULL。

但是我一定想念一些東西。 我收到的錯誤與我最初嘗試的錯誤相同:

Syntax error (missing operator) in query expression '(act.id = jag.aid) 
                  LEFT OUTER JOIN accountgroups gp ON (jag.gid = gp.id)'

怎么樣:

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

這會給你一個錯誤嗎? 也許更容易找出錯誤?

我認為在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

我不知道為什么括號很重要,但是我對此進行了測試,它似乎可以解決問題。

另一種嘗試:

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

Access可能無法使用兩個OUTER JOINS,所以我將第二個設為了INNER JOIN,應該可以

不僅使用前面建議的查詢設計器,而且使用MS Access關系工具記錄兩個外鍵(AID,GID)和它們引用的主鍵之間的關系。

這使得在查詢設計器中進行自然聯接幾乎像孩子一樣。 您甚至可以在概述的情況下使用查詢向導。

構建查詢后,為什么不使用查詢作為記錄源而不是使用表?

我將在PHP中做的一件事是將多個結果轉換為逗號分隔的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM