添加多重性作为行

问题描述

我使用 Sparx EA 构建关系数据库 (MS sql Server)。

该工具具有创建图表的功能

我使用查询

SELECT system.Name AS Series,systemElement.Name AS GroupName
FROM t_object systemElement
INNER JOIN t_object system ON system.Object_ID = systemElement.ParentID
INNER JOIN t_object organization ON organization.ParentID = systemElement.Object_ID
INNER JOIN t_object post ON post.ParentID = organization.Object_ID AND post.Stereotype = 'ActualPost'

WHERE system.Name = 'Name of my main system object'

得到

enter image description here

这很好,只是因为图表没有考虑到 ActualPosts 的多样性。

我可以访问多重性

SELECT system.Name AS Series,systemElement.Name AS GroupName,post.Name AS 'ActualPost',post.Multiplicity AS 'Multiplicity'
FROM t_object systemElement
INNER JOIN t_object system ON system.Object_ID = systemElement.ParentID
INNER JOIN t_object organization ON organization.ParentID = systemElement.Object_ID
INNER JOIN t_object post ON post.ParentID = organization.Object_ID AND post.Stereotype = 'ActualPost'

WHERE system.Name = 'Name of my main system object'

产生如下表格:

Series | GroupName | ActualPost | Multiplicity
Name of my main system element | OperationalPerformer A | Post AA | 1
Name of my main system element | OperationalPerformer A | Post AB | 1
Name of my main system element | OperationalPerformer A | Post AC | 2
Name of my main system element | OperationalPerformer B | Post BA | 1
Name of my main system element | OperationalPerformer B | Post BB | 1
Name of my main system element | OperationalPerformer C | Post CA | 3
Name of my main system element | OperationalPerformer C | Post CB | 2
Name of my main system element | OperationalPerformer C | Post CC | 5

我的想法是将多重性添加为行,因此像这样翻转表格:

Series | GroupName | ActualPost| Multiplicity
Name of my main system element | OperationalPerformer A | Post AA | 1
Name of my main system element | OperationalPerformer A | Post AB | 1
Name of my main system element | OperationalPerformer A | Post AC | 2

进入

Series | GroupName
Name of my main system element | OperationalPerformer A
Name of my main system element | OperationalPerformer A
Name of my main system element | OperationalPerformer A
Name of my main system element | OperationalPerformer A

虽然我不知道该怎么做。

有什么想法吗?

谢谢!

更新:

似乎 Sparx EA 在 sql 查询方面有一些限制...... 查询必须以 select 开头,请参阅 WITH clause within EA Sparx query

是否有针对所提供答案的解决方法

解决方法

如果 Multiplicity <= 2047

WITH myTable as (
    SELECT system.Name AS Series,systemElement.Name AS GroupName,post.Name AS 'ActualPost',post.Multiplicity AS 'Multiplicity'
    FROM t_object systemElement
    JOIN t_object system 
      ON system.Object_ID = systemElement.ParentID
    JOIN t_object organization 
      ON organization.ParentID = systemElement.Object_ID
    JOIN t_object post 
      ON post.ParentID = organization.Object_ID AND post.Stereotype = 'ActualPost'
    WHERE system.Name = 'Name of my main system object'
)
SELECT
    Series,GroupName
FROM
    myTable m
    JOIN master.dbo.spt_values v on m.Multiplicity > v.number
WHERE
    Type = 'P'

CTE 修改为 Derived Table 检查一下

SELECT
    Series,GroupName
FROM (
    SELECT system.Name AS Series,post.Multiplicity AS 'Multiplicity'
    FROM t_object systemElement
    JOIN t_object system 
      ON system.Object_ID = systemElement.ParentID
    JOIN t_object organization 
      ON organization.ParentID = systemElement.Object_ID
    JOIN t_object post 
      ON post.ParentID = organization.Object_ID AND post.Stereotype = 'ActualPost'
    WHERE system.Name = 'Name of my main system object'
) DT
    JOIN MASTER.dbo.spt_values v on DT.Multiplicity > v.number
WHERE
    Type = 'P'

,
;WITH T1 AS (
    SELECT
        system.Name AS Series,post.Multiplicity AS 'Multiplicity',1 as Cnt
    FROM t_object systemElement
        INNER JOIN t_object system ON system.Object_ID = systemElement.ParentID
        INNER JOIN t_object organization ON organization.ParentID = systemElement.Object_ID
        INNER JOIN t_object post ON post.ParentID = organization.Object_ID AND post.Stereotype = 'ActualPost'
    WHERE system.Name = 'Name of my main system object'

    UNION ALL

    SELECT
        Series,GroupName,Multiplicity,Cnt + 1 AS Cnt
    FROM T1
    WHERE Cnt < Multiplicity
)
SELECT
    Series,GroupName
FROM T1
OPTION (MAXRECURSION 0) -- set recursion limit to undefined

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...