2016-08-18 40 views
1

我有Animal表下面提到的表结构:更新只有当所有列都存在 - SQL Server 2008中

AnimalId | AnimalName | SelectAnimal 
1  | Cat  | NULL 
2  | Dog  | NULL 
3  | Sheep  | NULL 
4  | Cow  | NULL 

AnimalFeature表:

Animal Id | Feature | Present 
1   | Teeth | Y  
1   | Milk | Y 
1   | Tail | Y 
2   | Teeth | Y 
3   | MILK | Y 
4   | Teeth | Y 
4   | MILK | N 
4   | Tail | Y 

,我产生一个逗号使用以下查询的本列分隔列表

SELECT DISTINCT 
    A1.AnimalId, 
    STUFF((SELECT ', ' + ltrim(rtrim(A2.Present)) 
      FROM Animal AS A2 
      WHERE A1.AnimalId = A2.AnimalId 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') As ConcatValue 
FROM  
    Animal as A1 
GROUP BY 
    AnimalId; 

该req只有当所有功能都存在时才需要更新动物主表。

如果前两个特征是肯定的,那么selectanimal列将会有其他的没有 如果不是所有的特征都存在,那些记录需要被忽略。

最终的输出应该像

1 CAT Y 
2 DOG NULL 
3 SHEEP NULL 
4 COW N  

您能给任何指针或上如何做到这一点帮助?

+0

不需要做'选择DISTINCT'因为你'集团BY'返回无重复! (有些类似的功能,聚合函数是主要区别。) – jarlh

回答

1

类似下面应该做的事情,你需要

WITH AF AS (
SELECT AnimalId, 
     CASE WHEN COUNT(DISTINCT CASE 
           WHEN Present = 'Y' AND Feature IN ('Teeth', 'Milk' 
           THEN Feature 
           END) >= 2 
      THEN 'Y' 
      ELSE 'N' 
      END AS SelectAnimal   
FROM AnimalFeature 
WHERE Feature IN ('Teeth', 'Milk', 'Tail') 
GROUP BY AnimalId 
HAVING COUNT(DISTINCT Feature) = 3 
) 
UPDATE A 
SET A.SelectAnimal = AF.SelectAnimal 
FROM Animal A JOIN AF ON A.AnimalId = AF.AnimalId 
+0

谢谢..它的工作完美 –

相关问题