使用MS-Access 2013,我有一个表( Table_1 ),其中包含多种产品(由 ID 标识)的长格式属性列表(即每个产品有几行(最多500个),尽管产品的行数可能不同):
ID | Characteristics
----|------------------
1 | characteristc_a
1 | characteristc_aa
1 | characteristc_c
2 | characteristc_b
2 | characteristc_d
根据特定产品的特性,据说具有特定属性或不具有特定属性。特征“转换”为属性的方式在另一个表 Table_2 :
中定义Characteristics | Attribute | Value
-------------------|---------------|---------
characteristic_a | Property_1 | prop_1a
characteristic_aa | Property_1 | prop_1a
characteristic_b | Property_1 | prop_1b
characteristic_c | Property_2 | prop_2
characteristic_d | Property_3 | prop_3
例如,如果属性特征的产品值是' characteristic_a '或' characteristic_aa ' (或两者),其属性 Property_1 的值应为' prop_1a '。相反,如果其特征值为&#39> characteristic_b ',则 Property_1 属性的对应值应为' prop_1b '等。
最后,Table_3以宽格式收集所有产品的所有属性(即每个产品只有一行):
ID | Property_1 | Property_2 | Property_3
-----|------------|------------|------------
1 | prop_1a | prop_2 | NULL
2 | prop_1b | NULL | prop_3
我已成功将表2中的条件直接编码到更新语句中,例如:通过使用像
这样的东西UPDATE Table_3
SET Property_1 = ‘prop_1a’
WHERE ('characteristic_a') IN (SELECT Characteristics FROM Table_1 WHERE Table_3.ID = Table_1.ID)
OR ('characteristic_aa') IN (SELECT Characteristics FROM Table_1 WHERE Table_3.ID = Table_1.ID)
(因为我对SQL不太熟悉,即使这可能是一种笨拙的编码方式)
但是,“映射表” Table_2 包含2,000多个条目,因此编码所有这些条件将非常麻烦。相反,我希望UPDATE语句自动采取条件以及表2中的结果操作,例如:在伪代码中,例如:
UPDATE Table_3
SET Property_1 = [Appropriate value from Table_2]
WHERE [In all the entries of Table_1 with the same ID as the current row in Table_3]
[The attribute Characteristics in Table_1] IN
[The terms listed in Table_2 for the attribute Property_1]
非常感谢任何帮助!
答案 0 :(得分:0)
Table_2应该有一个ID字段,这个ID应该作为外键保存到Table_1中,而不是冗长的描述值。
构建一个连接主键和外键字段上的两个表的查询。将描述性文本字段拉入查询,然后切换到CROSSTAB设计。设置适当的行和列和值字段。行将是Table_1 ID(可能更具描述性,例如ProdID_FK),Column将是Table_2属性,Value将是Table_2 Value。使用“值”字段中的“最大”功能。
考虑:
TRANSFORM Max(Table2.CharValue) AS MaxOfCharValue
SELECT Table1.ProdID_FK
FROM Table2 RIGHT JOIN Table1 ON Table2.CharID = Table1.CharID_FK
GROUP BY Table1.ProdID_FK
PIVOT Table2.Attribute;
这将生成样本数据的示例输出。
可能不应该使用Value作为任何具有特殊含义的名称。