帮我解决这个 MySql 完整外连接(或联合)
这是将 MSSQL 转换为 MySQL 的结果。 以下是我试图开始工作的代码:
CREATE TEMPORARY TABLE PageIndex (
IndexId int AUTO_INCREMENT NOT NULL PRIMARY KEY,
ItemId VARCHAR(64)
);
INSERT INTO PageIndex (ItemId)
SELECT Paths.PathId
FROM Paths,
((SELECT Paths.PathId
FROM AllUsers, Paths
WHERE Paths.ApplicationId = @ApplicationId
AND AllUsers.PathId = Paths.PathId
AND (@Path IS NULL
OR Paths.LoweredPath LIKE LOWER(@Path))) AS SharedDataPerPath
UNION -- This used to be a FULL OUTER JOIN but MySQL doesnt support that.
(SELECT DISTINCT Paths.PathId
FROM PerUser, Paths
WHERE Paths.ApplicationId = @ApplicationId
AND PerUser.PathId = Paths.PathId
AND (@Path IS NULL
OR Paths.LoweredPath LIKE LOWER(@Path))) AS UserDataPerPath
ON SharedDataPerPath.PathId = UserDataPerPath.PathId)
WHERE Paths.PathId = SharedDataPerPath.PathId OR Paths.PathId = UserDataPerPath.PathId
ORDER BY Paths.Path ASC;
假设任何变量已经存在。 这个问题发生在“As SharedDataPerPath”部分,所以我猜测我给一个 select 语句添加了别名,以便您可以像 MySQL 中不支持的表一样访问它? 如果表模式有帮助,请回复评论,我会将其添加到问题中。
提前致谢!
This is coming from converting MSSQL to MySql. The following is code I'm trying to get to work:
CREATE TEMPORARY TABLE PageIndex (
IndexId int AUTO_INCREMENT NOT NULL PRIMARY KEY,
ItemId VARCHAR(64)
);
INSERT INTO PageIndex (ItemId)
SELECT Paths.PathId
FROM Paths,
((SELECT Paths.PathId
FROM AllUsers, Paths
WHERE Paths.ApplicationId = @ApplicationId
AND AllUsers.PathId = Paths.PathId
AND (@Path IS NULL
OR Paths.LoweredPath LIKE LOWER(@Path))) AS SharedDataPerPath
UNION -- This used to be a FULL OUTER JOIN but MySQL doesnt support that.
(SELECT DISTINCT Paths.PathId
FROM PerUser, Paths
WHERE Paths.ApplicationId = @ApplicationId
AND PerUser.PathId = Paths.PathId
AND (@Path IS NULL
OR Paths.LoweredPath LIKE LOWER(@Path))) AS UserDataPerPath
ON SharedDataPerPath.PathId = UserDataPerPath.PathId)
WHERE Paths.PathId = SharedDataPerPath.PathId OR Paths.PathId = UserDataPerPath.PathId
ORDER BY Paths.Path ASC;
Assume any variables exist already. Where this is breaking is on the 'As SharedDataPerPath' part, so I'm guessing that I aliasing a select statement so that you can access it like a table isn't supported in MySQL? If table schema would help, reply with a comment and I will add that to the question.
Thanks in advance!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
FULL OUTER JOIN
通常可以使用LEFT JOIN
和RIGHT JOIN
的UNION
来模拟。 即它全部位于左侧和右侧,尽可能匹配连接标准。 根据我的经验,它通常很少被使用。 我有一个大型系统,它只使用一次。由于
FULL OUTER JOIN
不可用,您似乎想要在这里做的是UNION
两个集合并在两个集合之间设置一些JOIN
标准子集,这确实是不可能的。 示例中UNION
的两个集合不能有别名,也不能有尝试链接它们的WHERE
子句。A
FULL OUTER JOIN
can often be simulated with theUNION
of bothLEFT JOIN
andRIGHT JOIN
. i.e. it is all on the left and those on the right, matching where possible on the join criteria. It is usually extremely rarely used, in my experience. I have a large system where it is only used once.What you seem to be wanting to do here because
FULL OUTER JOIN
is not available is toUNION
two sets and set someJOIN
criteria between the two subsets, which really isn't possible. The two sets that areUNION
ed in your example cannot have aliases, nor can they have aWHERE
clause which attempts to link them.上面描述的将左外连接和右外连接联合在一起的方法效果很好,并且似乎是普遍接受的解决方案。 然而,正如我在阅读留言板上的各种示例时发现的那样,其中遗漏了一些细节。
将用于连接的列上的表源从一个选择交换到另一个选择,以考虑外连接生成的 NULL。
将
将 COALESCE 函数添加到您的“固定列”,该函数也可能作为外连接生成的 NULL 返回。
将 COALESCE 函数添加到您的“固定
例子:
The method described above with the left and right outer joins unioned together works well and seems to be the commonly accepted solution. There are some details left out of this however as I have found when reading various examples across the message boards.
Swap your the table sources on the columns you use to join with from one select to the other to account for NULLs produced by the outer joins.
Add COALESCE functions to your "fixed columns" that might also come back as NULLs produced by the outer joins.
Example: