我在 sql 中的两个表之间遇到问题
表1
名称_id | 1 | 2 | 3 |
---|---|---|---|
规格-A | 100 | 110 | 120 |
规格-B | 200 | 220 | 230 |
表2
名字 | 名称_id | 猫 |
---|---|---|
M.约翰 | 规格-B | 2 |
J·史密斯 | 规格-A | 3 |
所以我想连接两个表,我想在表 2 中选择人员 name_id 和他的类别,并在表 1 中选择行和列
select *
from table 1
inner join table 2 on table1.name_id = table2.name_id
但是我无法将 table2.cat 与表 1 中的每一列连接起来 例如 table2.cat = 2 和 table1.2 自动。
我想看下一个:
名字 | 名称_id | 猫 | 价格 |
---|---|---|---|
M.约翰 | 规格-B | 2 | 220 |
J·史密斯 | 规格-A | 3 | 120 |
我想看下一个:
名字 | 名称_id | 猫 | 价格 |
---|---|---|---|
M.约翰 | 规格-B | 2 | 220 |
J·史密斯 | 规格-A | 3 | 120 |
查询将是:
WITH T AS
(
SELECT T2.name, T2.name_id, T2.cat,
CASE T2.cat WHEN 1 THEN T1."1"
WHEN 2 THEN T1."2"
WHEN 3 THEN T1."3"
END AS price
FROM "Table 1" AS T1
JOIN "Table 2" AS T2
ON T1.name_id = T2.name_id
)
SELECT *
FROM T
WHERE price IS NOT NULL;
但是你的数据结构不尊重数据建模的最新技术......所以性能将是灾难性的......
表 1 将被分成 2 个表:
CREATE "Table 1"
(name_id VARCHAR(32) PRIMARY KEY);
CREATE "Table 1.1"
(name_id VARCHAR(32) NOT NULL REFERENCES "Table 1" (name_id),
cat INT NOT NULL,
price DECIMAL(16,2) NOT NULL,
PRIMARY KEY (name_id, cat );
然后您可以拥有一个显示旧版本“表 1”的视图...(带有一些 PIVOT 运算符或至少一个 CASE 语句)。