【问题标题】:How could I Nest a SELECT query and check it against a top level SELECT value?我如何嵌套一个 SELECT 查询并根据顶级 SELECT 值检查它?
【发布时间】:2017-01-18 18:32:54
【问题描述】:

我最近正在学习 SQL,并且正在使用我无法更改的现有数据库。

我们有一个表格,其中包含每个帐户的列表。顶级帐户可以选择拥有“子帐户”。我想做的是为所有子帐户制作一个报告,并为其“顶级帐户所有者”列一栏。

这是一个示例表。

LName AccountType   AccountID OwnerID
Amber SubAccount    A1        A3
Bob   SubAccount    A2        A3
Ken   MasterAccount A3        A3
Jim   SubAccount    B1        B3
Sam   SubAccount    B2        B3
Fred  MasterAccount B3        B3

有了这个,我想用主账户持有人的名字来报告所有的子账户。像这样的

SubAccountHolder MasterAccountHolder
Amber            Ken
Bob              Ken
Jim              Fred
Sam              Fred

当记录 1 的 ID 与另一条记录 OwnerID 匹配时,基本上将同一表中的 2 条记录合并为 1 条。如果个人 ID 和所有者 ID 匹配,则它们是这些子帐户的主帐户。我用它来查找所有主帐户。然后我想过滤它以仅显示每条记录的一个主帐户并将其添加到报告中的子帐户记录中。

这是我目前正在使用的实际代码

SELECT Users.FirstName, 
    Users.LastName, 
    Users.Phone, 
    Users.Email, 
    Accounts.SetupDate, 
    AccountStatus.Name AS AccountStatus, 
    Accounts.WLCOwnerID,
    WLCOwner = STUFF((
        SELECT ',' + Users.Email
        FROM Accounts 
            INNER JOIN UserAccounts ON Accounts.WLCOwnerID = UserAccounts.UserID
            INNER JOIN Users ON UserAccounts.UserID = Users.ID
        WHERE Accounts.WLCOwnerID = UserAccounts.UserID
        FOR XML PATH ('')
    ), 1, 1, '')

FROM AccountStatus INNER JOIN (
        (
            (AccountTypes INNER JOIN Accounts ON AccountTypes.ID = Accounts.AccountTypeID) 
            INNER JOIN UserAccounts ON Accounts.ID = UserAccounts.AccountID
        ) 
        INNER JOIN Users ON UserAccounts.UserID = Users.ID
    ) ON AccountStatus.ID = Accounts.StatusID

WHERE Accounts.AccountTypeID=6 AccountStatus.Name='SubAccount'

ORDER BY Accounts.SetupDate DESC;

所以我的顶级 SELECT 是获取所有帐户持有人信息的查询然后我的嵌套 SELECT 是所有主帐户持有人电子邮件地址的列表。我想报告所有附有主账户持有人电子邮件地址的子账户客户。

我遇到的问题是在嵌套 SELECT 中,我想将主账户 ID 与其主账户持有人的顶级子账户 ID 匹配。遗憾的是,这两种类型的帐户都在同一个表格中,我目前无法选择“修复”表格以使其正常工作。

【问题讨论】:

    标签: sql


    【解决方案1】:
    SELECT a.lname SubAccountHolder,
           b.lname MasterAccountHolder
      FROM accounts a
      JOIN accounts b
        ON a.ownerid = b.accountid
     WHERE a.accounttype = 'SubAccount'
       AND b.accounttype = 'MasterAccount';
    
    +------------------+---------------------+
    | SubAccountHolder | MasterAccountHolder |
    +------------------+---------------------+
    | Amber            | Ken                 |
    | Bob              | Ken                 |
    | Jim              | Fred                |
    | Sam              | Fred                |
    +------------------+---------------------+
    

    【讨论】:

    • 在这个例子中,“a”和“b”代表什么?这是一种命名表的方法,以便您可以连接 2 个相同的表吗?
    • a 和 b 只是一个别名,因此数据库引擎现在可以从哪个基表中获取列“lname” - 如果您连接表并处理两者中都存在的列,这一点很重要表。 RDBMS 不知道您指的是哪个表,因此您必须通过列前面的别名或完整表名来指定它(取决于您可能或必须选择的 RDBMS 选项)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多