【问题标题】:How to select from 2 FB SQL tables with foreign keys?如何从 2 个带有外键的 FB SQL 表中进行选择?
【发布时间】:2017-10-24 16:06:37
【问题描述】:

我创建了 2 个如下表:

create table accounts(
accountOID int primary key not null,
bankcodenumber int,
accountnumber int
);

create table user(
userOID int primary key not null,
name varchar(25),
accountOID0 int,
accountOID1 int
);

每个用户有 1 或 2 个帐户,因此要声明外键,我输入以下内容:

alter table user add foreign key(accountOID0) references account(accountOID);

alter table user add foreign key(accountOID1) references account(accountOID);

现在,我怎样才能像这样列出帐户:

Name    | Bankcodenumber | Accountnumber
Sanchez | 0123456789     | 547
Trent   | 1234567890     | 278
Sanchez | 2345678901     | 480
Carlson | 3435577890     | 503
Jackson | 6833556904     | 168
...     | ...            | ...

我试过了,但没有成功:

select name, (select bankcodenumber, accountnumber from account
where user.accountOID0 = accountOID or user.accountOID1 = accountOID)
from user order by name;

【问题讨论】:

    标签: sql select foreign-keys firebird


    【解决方案1】:

    你似乎想要union all

    select u.name, a.Bankcodenumber, a.Accountnumber
    from user u join
         account a
         on u.accountoid0 = a.accountoid
    union all
    select u.name, a.Bankcodenumber, a.Accountnumber
    from user u join
         account a
         on u.accountoid1 = a.accountoid;
    

    【讨论】:

      【解决方案2】:
      SELECT u.name,
             a.bankcodenumber,
             a.accountnumber 
        FROM user u
      INNER JOIN 
             accounts a
          ON u.accountOID0 = a.accountOID
      UNION
      SELECT u.name,
             a.bankcodenumber,
             a.accountnumber 
        FROM user u
      INNER JOIN 
             accounts a
          ON u.accountOID1 = a.accountOID; 
      

      【讨论】:

        【解决方案3】:

        不带UNION 的选项,但使用带有连接的单个SELECT

        http://sqlfiddle.com/#!5/17ccc/1/0

        select
           Coalesce(u1.name, u0.name) as name1,
           a.bankcodenumber,
           a.accountnumber
         from accounts a
           left join users u0
             on u0.accountOID0 = a.accountOID
           left join users u1
             on u1.accountOID1 = a.accountOID
         where name1 is not null
        

        它使用topicstarter的示例数据输入为

        create table accounts(
        accountOID int primary key not null,
        bankcodenumber int,
        accountnumber int
        );
        
        create table users(
        userOID int primary key not null,
        name varchar(25),
        accountOID0 int references accounts(accountOID),
        accountOID1 int references accounts(accountOID)
        );
        
        insert into accounts values (1, 0123456789, 547);
        insert into accounts values (2, 1234567890, 278);
        insert into accounts values (3, 2345678901, 480);
        insert into accounts values (4, 3435577890, 503);
        insert into accounts values (5, 6833556904, 168);
        
        insert into users values(1, 'Trent', NULL, 2);
        insert into users values(2, 'Carlson', 4, NULL);
        insert into users values(3, 'Sanchez', 3, 1);
        insert into users values(4, 'Jackson', 5, NULL);
        

        如果在某些情况下一个用户的accountOID0 等于另一个用户的accountOID1,它可能会丢失一些数据。但是 topicstarter 暗示不应该有这样的情况。虽然他也没有说是否有一些限制或其他保护措施来确保这种情况永远不会发生。

        【讨论】:

          猜你喜欢
          • 2014-10-17
          • 1970-01-01
          • 2017-09-12
          • 2012-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多