我几天来一直在努力改变我的查询,而我却无法得到我想要的结果。 我希望有人能帮助我改变我的查询。
现在有以下查询:
SELECT
t.tId,
t.tName,
a.aId,
a.aName,
u.uId,
u.uName
FROM
tableT t
LEFT JOIN t_a ta USING (tId)
LEFT JOIN t_u tu USING (tId)
LEFT JOIN tableA a ON a.aId = ta.aId
LEFT JOIN tableU u ON u.uId = tu.uId
它返回tableT中的行,其中tableA和tableU中的匹配行。 现在我必须更改它以获得一个结果,其中返回tableA中的所有行。
如果我没弄错,我想要一个与tableA的完全外连接和一个与tableU的LEFT JOIN。 (我知道FULL OUTER JOIN不存在,这让我更加困惑)
表t_a包含多对多关系,表t_u包含来自tableT各自的多对一关系。
简而言之,当我搜索一个值时,我希望返回以下行: 包含值和的任何tableT行匹配来自tableA的tableU 和匹配的行。 包含该值的任何其他(不匹配的)tableA行。 tableU中没有其他(不匹配的)行。
之前需要的值:
tableT tableA tableU
ANY ANY ANY
ANY NULL ANY
ANY NULL NULL
现在需要的值:
tableT tableA tableU
ANY ANY ANY
ANY NULL ANY
ANY NULL NULL
**NULL** **ANY** **NULL**
我在错误的情况下寻求帮助时道歉。 提前感谢您的帮助。
这里有一个小提琴:http://sqlfiddle.com/#!2/f6301/11
它返回除包含:
的行之外的所有所需行TID TNAME AID ANAME UID UNAME
NULL NULL 4 aName4 NULL NULL
答案 0 :(得分:0)
我认为你想要的是从tid
和tableT
的所有t_a
开始:
FROM ((SELECT t.tID from tableT) UNION
(SELECT ta.tID from tableA t_a)
) ids left outer join
tableT t
USING (tId) LEFT JOIN
t_i ti
USING (tId) LEFT JOIN
tableA a
ON a.aId = ta.aId LEFT JOIN
tableU u
ON u.uId = ti.uId
答案 1 :(得分:0)
表t_a包含多对多关系,表t_u包含多个 来自tableT各自的一个关系。
但是t_a和t_u之间没有任何关系。然而,你正试图让他们彼此分享元组空间。
这样看。 TableT是一个超类。表t_a扩展TableT以形成它自己的类。表t_u还扩展了TableT以形成它自己的类。因此,虽然t_a和t_u都扩展了TableT,但它们形成了彼此独立的独立类(实体)。实际上没有办法将它们变成一个实体表达式(元组)。
换句话说,你试图混合苹果和橙子,关系数据库不能很好地做水果沙拉。
答案 2 :(得分:0)
如果我没有弄错我需要的查询如下:
SELECT
t.tId,
t.tName,
a.aId,
a.aName,
u.uId,
u.uName
FROM
tableT t
LEFT JOIN t_a ta USING (tId)
LEFT JOIN t_u ti USING (tId)
LEFT JOIN tableA a USING (aId)
LEFT JOIN tableU u USING (uId)
UNION
SELECT
t.tId,
t.tName,
a.aId,
a.aName,
NULL,
NULL
FROM
tableT t
RIGHT JOIN t_a ta USING (tId)
RIGHT JOIN tableA a USING (aId)
WHERE t.tId IS NULL
但我确定它可以优化或不同。
它现在/应该返回tableT中的所有行,包含可能的相关tableA数据和可能的相关tableU数据以及任何其他tableA行。