mysql - MySQL - 使用手动交叉连接创建视图
问题描述
我正在尝试基于多个 if 条件创建具有交叉连接的视图。
我知道哪一列要加入哪一列。
表 A 中的 1,表 B 中的 1 和 2,
表 A 中为 2,表 B 中为 1 和 3。
我可以通过创建具有此逻辑的映射表并将其用于连接来做同样的事情,但它可以在视图定义本身中完成,即逻辑在视图定义中吗?
表 A
ID | Animal
1 | Man
2 | Panda
表 B
ID | Fruit
1 | Bananna
2 | Apple
3 | Bamboo
我想根据预期的已知条件查看视图
看法
Man | Bananna
Man | Apple
Panda | Bananna
Panda | Bamboo
解决方案
您可以使用以下内容将映射硬编码到视图中:
CREATE VIEW BadWay
AS
SELECT map.AID, a.Name AS AName, map.BID, b.Name AS BName
FROM TableA AS a
INNER JOIN
( SELECT 1 AS AID, 1 AS BID UNION ALL
SELECT 1 AS AID, 2 AS BID UNION ALL
SELECT 2 AS AID, 1 AS BID UNION ALL
SELECT 2 AS AID, 3 AS BID
) AS map
ON map.AID = a.ID
INNER JOIN TableB AS b
ON b.ID = map.BID;
我强烈建议您不要这样做。如果并且当您想要添加、编辑或删除映射时,通过在表中插入/更新/删除行比更改视图更容易做到这一点。
相反,最好创建一个联结表(关联实体):
CREATE TABLE ABMapping
(
AID INT NOT NULL,
BID INT NOT NULL
);
INSERT INTO ABMapping (AID, BID)
VALUES (1, 1), (1, 2), (2, 1), (2, 3);
然后你可以在你的视图中加入这个:
CREATE VIEW GoodWay
AS
SELECT map.AID, a.Name AS AName, map.BID, b.Name AS BName
FROM TableA AS a
INNER JOIN ABMapping AS map
ON map.AID = a.ID
INNER JOIN TableB AS b
ON b.ID = map.BID;
推荐阅读
- javascript - 引导多页表不能完全与 Ajax 一起使用
- javascript - 如何将使用 javascript 制作的网站保存到文件中
- php - 为什么 laravel 5.6 返回文件不存在错误?
- java - CompletableFuture 并行执行几个线程,串行执行几个线程
- javascript - 如何使 Darkmode Js 不粘?
- google-bigquery - 在 BigQuery 中正确使用 COALESCE()
- macos - 恢复购买与收据验证
- mysql - 在 MySQL 中合并 2 个表中的数据
- python - 如果自定义命令的任何步骤失败,则中止 cmake 配置
- python - 获取Python中特定节点的所有子节点