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
我知道这可能有点令人困惑,但基本上数据可以做以下两件事之一:
- table中的数据可以连接到B,然后是C,然后是D,然后是E,或者
- 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%'
这个标题可能是个糟糕的标题,但我想不出更好的...
我有一种独特的模式,其中我有 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
的主要 IDTable乙:
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
我知道这可能有点令人困惑,但基本上数据可以做以下两件事之一:
- table中的数据可以连接到B,然后是C,然后是D,然后是E,或者
- 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%'