2

我对 SQL 很陌生,但需要编写一个查询来执行以下操作。使用 MS SQL Server 2005。

配置文件定义中的配置文件定义
------ -------- ----------      
ProfileID 定义ID 定义ID
ProfileType ProfileID 定义类型
个人资料名称                                          

在定义表中,定义Type可以是TypeA、TypeB……TypeZ。我想确保对于某个配置文件类型,ProfileTypeA 定义具有所有类型,TypeA -> TypeZ。

但有些类型已经存在于表中,我不想重复。

所以它就像
从 ProfileType = ProfileTypeA 的 Profile 中选择 ProfileID
对于每个 ProfileID
   如果在定义类型 A 中不存在
   将 TypeA 插入定义
   将 ProfileID、DefinitionID 插入 DefinitionInProfile

   ...对 TypeB、TypeC 重复...
结尾
  1. 我需要获取 ProfileType = ProfileTypeA 的所有实例

  2. 然后获取第一个 Profile.profileID

  3. 然后检查DefinitioninProfile 表以获取其中profileID = Profile.ProfileID 的DefinitionID 列表

  4. 然后对于所有这些定义 ID,检查是否有一个名为“TypeA”的定义类型,如果没有插入,则忽略它。然后对'TypeB'做同样的事情,对typec重复,.. typeZ

返回第 2 步并获取下一个 Profile.ProfileID 并为该配置文件 ID 重复 3 和 4。

4

1 回答 1

1

试试这个:

INSERT DefinitionInProfile 
    (ProfileID, DefinitionID)
SELECT
    P.ProfileID, D.DefinitionID
FROM
    --All permutations of P and D
    Profile P
    CROSS JOIN
    Definition D
WHERE
    --Edit (added 2 rows)
    --But filter and lookup type -> id
    P.ProfileType = ProfileTypeA
    AND
    --End edit
    --But not where the defid is already there for that profileid
    NOT EXISTS (SELECT * --or 1!!
        FROM
            DefinitionInProfile DP
        WHERE
            DP.ProfileID = P.ProfileID AND
            DP.DefinitionID= D.DefinitionID)
于 2009-02-04T10:19:49.330 回答