首页 > 解决方案 > 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

标签: mysqlsql

解决方案


您可以使用以下内容将映射硬编码到视图中:

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;

DB<>Fiddle 上的示例


推荐阅读