如何从带有外键的 2 个 FB SQL 表中 select?
How to select from 2 FB SQL tables with foreign keys?
我创建了 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;
你似乎想要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;
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;
没有 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 暗示不应该有这样的情况。尽管他也没有说是否有一些限制或其他警卫来确保永远不会发生这种情况。
我创建了 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;
你似乎想要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;
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;
没有 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 暗示不应该有这样的情况。尽管他也没有说是否有一些限制或其他警卫来确保永远不会发生这种情况。