三个表上带有外键的 SQL 查询

标签 sql database sqlite

我有三张 table

表 1.color_sets_infoset_id (PK)、set_name

表 2.颜色,包含 set_id (FK)、color_id (PK)、color_name color_formula

表 3.mixed_colorscolor_id1(FK)、color_id2(FK)、color_formula


外键colors.set_id引用color_sets_info.set_id

外键mixed_colors.color_id1引用colors.color_id

外键mixed_colors.color_id2引用colors.color_id


如何从mixed_colors特定set_namecolor_formula以及所有相关列获取:

colors.color_name(对于mixed_colors.color_id1),

colors.color_name(对于mixed_colors.color_id2),

color_sets_info.set_name(对于第一个colors.color_name),

color_sets_info.set_name(第二个colors.color_name)

mixed_colors.color_formula


例如:

color_sets_info           colors
+--------+-----------+    +--------+----------+------------+---------------+
| set_id | set_name  |    | set_id | color_id | color_name | color_formula |
+--------+-----------+    +--------+----------+------------+---------------+
| 1      | somename1 |    | 1      | 1        | black      | R0G0B0        |
| 2      | somename2 |    | 1      | 2        | yellow     | R255G255B0    |
| 3      | somename3 |    | 2      | 3        | green      | R0G255B255    |
+--------+-----------+    | 3      | 4        | red        | R255G0B0      |
                          +--------+----------+------------+---------------+

mixed_colors
+-----------+-----------+---------------+
| color_id1 | color_id2 | color_formula |
+-----------+-----------+---------------+
| 1         | 4         | R127G0B0      |
| 2         | 3         | R127G255B127  |
| 3         | 1         | R0G127B127    |
+-----------+-----------+---------------+

我需要从 mixed_colors color_formula 获取每个混合颜色的两个 set_names 和两个 color_names ,其中 1 ) 仅使用 somename1somename2 颜色集 2) 以及 R127G0B0 公式

最佳答案

SELECT
    m.color_formula,
    cs1.set_name AS set_name1,
    c1.color_name AS color_name1,
    cs2.set_name AS set_name2,
    c2.color_name AS color_name2
FROM
    mixed_colors m
    JOIN colors c1 ON
        m.color_id1 = c1.color_id
    JOIN color_sets_info cs1 ON
        c1.set_id = cs1.set_id
    JOIN colors c2 ON
        m.color_id2 = c2.color_id
    JOIN color_sets_info cs2 ON
        c2.set_id = cs2.set_id;

或者,如果您愿意,可以先将颜色和颜色集收集到 View 中:

CREATE VIEW vw_colors AS
SELECT
    color_id,
    set_id,
    color_name,
    set_name
FROM
    colors c
    JOIN color_sets_info cs ON
        c.set_id = cs.set_id;

然后查询:

SELECT
    m.color_formula,
    v1.set_name AS set_name1,
    v1.color_name AS color_name1,
    v2.set_name AS set_name2,
    v2.color_name AS color_name2
FROM
    mixed_colors m
    JOIN vw_colors v1 ON
        m.color_id1 = v1.color_id
    JOIN vw_colors v2 ON
        m.color_id2 = v2.color_id;

关于三个表上带有外键的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22351426/

相关文章:

SQL错误: ROW_NUMBER() OVER (PARTITION

sql - 仅查询最早可能日期的数值

c# - 数据库上没有事务的 SQL 错误 "uncommittable transaction is detected at the end of batch"

mysql - 用户创建的对象存储在哪里?

database - 使用cassandra查询和删除聊天收件箱系统

android - 房间 - 插入或替换,但保留数据库字段?

SQL Server - 向现有表添加列的成本

java - MySql STR_TO_DATE 在存储过程中不起作用

android - 查询 Room 中对象的类型转换列表

java - 如何使用 SQL WHERE IN 中的项目列表/数组动态填充查询