SQL 连接具有一对一和一对多关系的表

SQL Join tables that have both a one to one and one to many relationship

这个标题可能是个糟糕的标题,但我想不出更好的...

我有一种独特的模式,其中我有 5 个 table 具有关系,但其中一个 table 与两个 table 有关系。为了减少混淆,让我向您展示架构:

Table答:

AID BID Name
1   1   101
2   1   102
3   1   103
4   2   104
5   3   105
6   4   106

其中 AID 是 table A 的主要 ID,BID 是 table B

的主要 ID

Table乙:

BID   CID   DID   Name
1     null  3     101
2     null  4     102
3     1     null  103
4     2     null  104

其中 CID 为空或 DID 为空

Table C:

CID   DID   Name
1     1     A
2     2     B
3     3     A
4     4     B
5     5     C
6     5     A

Table D:

DID   EID   Name
1     1     Alpha
2     1     Bravo
3     1     Charlie
4     1     Echo
5     2     Delta

Table E:

EID   Name
1     Home
2     Away

我知道这可能有点令人困惑,但基本上数据可以做以下两件事之一:

  1. table中的数据可以连接到B,然后是C,然后是D,然后是E,或者
  2. table中的数据A可以连接到B,然后是D,然后是E

我的问题是我想创建一个 SQL 查询,它将加入所有 table,抓取 A.Name、A.AID 和 E.Name 来自 B.Name LIKE '%Some name%'、C.Name LIKE '%Some name%'、D.Name LIKE '%Some name%' 和 E.Name LIKE '%Some name%'。

例如,我想要一个查询,如果我设置 E.Name LIKE '%Home%',查询将 return:

E.Name    E.EID    D.DID    C.CID    B.BID    A.AID    A.Name
Home      1        3        null     1        1        101
Home      1        3        null     1        2        102
Home      1        3        null     1        3        103
Home      1        4        null     2        4        103
Home      1        1        1        3        5        103
Home      1        2        2        4        6        103

目前我的当前查询只有 returns "random" 数据,我的意思是它 returns 一些但不是正确的东西,我无法弄清楚是什么returning 的行有一个共同点,即查询正在拉取。但基本上我的查询是:

select ... from tableA, 
inner join tableB on A.BID=B.BID 
inner join tableC on B.CID=C.CID 
inner join tableD on C.DID=D.DID OR B.DID=D.DID 
inner join E.EID = D.EID
WHERE E.Name LIKE '%Home%';

任何建议都会很棒!谢谢!!!

SELECT  *
FROM    a
JOIN    b
USING   (bid)
LEFT JOIN
        с
USING   (cid)
JOIN    d
ON      d.did = COALESCE(c.did, b.did)
JOIN    e
USING   (eid)
WHERE   e.name LIKE '%home%'

如果您将几个 INNER JOIN 更改为 LEFT JOIN,您应该会得到想要的结果。

SELECT e.Name, e.EID, d.DID, c.CID, b.BID, a.AID, a.Name
FROM TableA a
INNER JOIN TableB b ON a.BID = b.BID
LEFT JOIN TableC c ON b.CID = c.CID
INNER JOIN TableD d ON c.DID = d.DID or b.DID = d.DID
INNER JOIN TableE e ON d.EID = e.EID
WHERE e.Name LIKE '%Home%'