MS Access(通过VB.NET) - 将链接的属性表转换为输出

时间:2016-11-18 20:12:42

标签: sql ms-access

我搜索过,发现了很多类似的东西,但不是我想要的东西。

我本质上是一堆带有属性和值的链接表。

xxBio table

xxBio_ID    xxBio_LINK
1           100
2           101



xx table

xxBio_LINK  xxAttr_LINK
100         1000
101         2000



xxAttr table

xxAttr_LINK xxAttrCat_1_LINK    xxAttrCat_2_LINK
1000        null                550
2000        650                 null



xxAttrCat_1 table

xxAttrCat_1_LINK    xxAttrCat_1_Description     xxAttrCat_1_Value
650                 wumpus                      20


xxAttrCat_2 table

xxAttrCat_2_LINK    xxAttrCat_2_Description     xxAttrCat_2_Value
550                 frith                       30

输出需要:

xxBio_ID    frith   wumpus
1           30      null
2           null    20

我可以很容易地看到如何使用attribute_name1,attribute_value1,attribute_name2,attribute_value2等列来获取结果集。

SELECT xxBio.ID, xxAttrCat_1.xxAttrCat_1_Description, xxAttrCat_1.xxAttrCat_1_Value, xxAttrCat_2.xxAttrCat_2_Description, xxAttrCat_2.xxAttrCat_2_Value

FROM ((

(xx INNER JOIN xxBio ON xx.xxBio_LINK = xxBio.xxBio_LINK)

 INNER JOIN xxAttr ON xx.xxAttr_LINK = xxAttr.xxAttr_LINK)

 LEFT JOIN xxAttrCat_1 ON xxAttr.xxAttrCat_1_LINK = xxAttrCat_1.xxAttrCat_1_LINK)
 LEFT JOIN xxAttrCat_2 ON xxAttr.xxAttrCat_2_LINK = xxAttrCat_2.xxAttrCat_2_LINK

但这不是我们所需要的。我们需要属性名称为列名。

我们如何实现这一目标?

更新问题: 事实证明,我们误解了要求,所以我们不得不采取不同的路线,并没有尝试答案。我很感激帮助。

2 个答案:

答案 0 :(得分:0)

将SQL放在字符串中并从VBA执行。 (动态SQL?)

sql = "SELECT xxBio.ID, " & xxAttrCat_1.xxAttrCat_1_Description & ", " & ...

答案 1 :(得分:0)

考虑使用IIF()条件语句:

<input type="text" id="english" name="english" placeholder="English sentence" />
<div id="english_error" class="val_error"></div>

如果每个ID可以在相同描述中具有多个值,并且您需要对所有相应值求和或平均,则将查询转换为条件聚合(称为透视)。下面还使用表别名SELECT xxBio.ID, IIF(xxAttrCat_1.xxAttrCat_1_Description = 'wumpus', xxAttrCat_1.xxAttrCat_1_Value, NULL) As [wumpus], IIF(xxAttrCat_2.xxAttrCat_2_Description = 'frith', xxAttrCat_2.xxAttrCat_2_Value, NULL) As [frith] FROM (((xx INNER JOIN xxBio ON xx.xxBio_LINK = xxBio.xxBio_LINK) INNER JOIN xxAttr ON xx.xxAttr_LINK = xxAttr.xxAttr_LINK) LEFT JOIN xxAttrCat_1 ON xxAttr.xxAttrCat_1_LINK = xxAttrCat_1.xxAttrCat_1_LINK) LEFT JOIN xxAttrCat_2 ON xxAttr.xxAttrCat_2_LINK = xxAttrCat_2.xxAttrCat_2_LINK abc1来简化和组织。

c2

如果此类描述可能很多,请使用MS Access SQL的crosstab查询。但由于您有两个类别,因此在每个类别上运行交叉表并将其另存为存储的查询或视图。然后,加入:

SELECT b.ID,     
      SUM(IIF(c1.xxAttrCat_1_Description='wumpus', c1.xxAttrCat_1_Value, NULL)) As [wumpus], 
      SUM(IIF(c2.xxAttrCat_2_Description='frith', c2.xxAttrCat_2_Value, NULL)) As [frith]    
FROM (((xx 
INNER JOIN xxBio b ON xx.xxBio_LINK = b.xxBio_LINK)
INNER JOIN xxAttr a ON xx.xxAttr_LINK = a.xxAttr_LINK)
LEFT JOIN xxAttrCat_1 c1 ON a.xxAttrCat_1_LINK = c1.xxAttrCat_1_LINK)
LEFT JOIN xxAttrCat_2 c2 ON a.xxAttrCat_2_LINK = c2.xxAttrCat_2_LINK
GROUP BY b.ID

请注意:Access查询中不允许使用双短划线进行上述注释,并且在保存的查询中只允许使用一条语句。 Access每个表/查询的限制为255列,因此除非使用--CATEGORY 1 TRANSFORM SUM(c1.xxAttrCat_1_Value) AS SumOfValue SELECT b.ID, FROM ((xx INNER JOIN xxBio b ON xx.xxBio_LINK = b.xxBio_LINK) INNER JOIN xxAttr a ON xx.xxAttr_LINK = a.xxAttr_LINK) LEFT JOIN xxAttrCat_1 c1 ON a.xxAttrCat_1_LINK = c1.xxAttrCat_1_LINK GROUP BY b.ID PIVOT c1.xxAttrCat_1_Description; --CATEGORY 2 TRANSFORM SUM(c2.xxAttrCat_2_Value) AS SumOfValue SELECT b.ID, FROM ((xx INNER JOIN xxBio b ON xx.xxBio_LINK = b.xxBio_LINK) INNER JOIN xxAttr a ON xx.xxAttr_LINK = a.xxAttr_LINK) LEFT JOIN xxAttrCat_2 c2 ON a.xxAttrCat_2_LINK = c2.xxAttrCat_2_LINK GROUP BY b.ID PIVOT c2.xxAttrCat_2_Description; --CROSSTAB QUERIES JOIN SELECT c1.*, c2.* FROM Categ1CrossTabQ c1 INNER JOIN Categ1CrossTabQ c2 ON c1.ID = c2.ID; 子句,否则大于255的旋转值将会出错。最后,您不能将交叉表用作子查询。并且交叉表严格来说是MS Access命令,而不是在其他DBMS中使用。