【问题标题】:SQL Join tables that have both a one to one and one to many relationship具有一对一和一对多关系的 SQL 连接表
【发布时间】:2026-01-12 14:05:01
【问题描述】:

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

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

表 A:

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

其中 AID 是表 A 的主 ID,BID 是表 B 的主 ID

表 B:

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

其中 CID 为空或 DID 为空

表 C:

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

表 D:

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

表 E:

EID   Name
1     Home
2     Away

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

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

我的问题是我想创建一个 SQL 查询,它将加入所有表,从 B.Name LIKE '%Some name%' 的任何行中获取 A.Name、A.AID 和 E.Name, C.Name LIKE '%Some name%'、D.Name LIKE '%Some name%' 和 E.Name LIKE '%Some name%'。

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

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

目前我当前的查询只返回“随机”数据,我的意思是它返回了一些东西,但不是正确的东西,我无法弄清楚它返回的行与查询拉动的共同点是什么。但基本上我的查询是:

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%';

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

【问题讨论】:

  • 您现在放置的查询不可能返回您发布的结果集。 B.CID=C.CID 不允许返回 c.cid 的任何 NULL 值。
  • @Aldwoni 很抱歉我对您的编辑的评论有问题(感谢清理 like 标签,但您还应该编辑掉其他明显的错误 - 例如从标题中删除“已解决”字样) .

标签: mysql sql join relationship sql-like


【解决方案1】:

如果您将几个 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%'

【讨论】:

  • 您的答案和 Quassnoi 的答案都完美无缺!谢谢!
  • 为什么左边加入d
  • 忽略了它。谢谢。
  • 应该 INNER JOIN TableD d ON c.DID = d.DID or b.DID = d.DIDLEFT JOIN TableD d ON c.DID = d.DID or b.DID = d.DID
  • 没关系,在这种情况下,它们都会为您提供相同的结果。但是 INNER JOIN 会提供更好的性能。
【解决方案2】:
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%'

【讨论】:

  • 您的回答和罗伯托的回答都完美!谢谢!
最近更新 更多