选择组。 Case ForRun?

时间:2010-02-16 06:04:34

标签: sql

这是一个结构: - / alt text http://s004.radikal.ru/i207/1002/79/ed7ac0a97d0b.jpg 所以我需要选择 来自CfgListGroupParIzm的ID和名称,用于CfgIzmeritel,使用Type和ForRun - False 它

SELECT A.ID_ListGroupParIzm, A.Name
FROM CfgListGroupParIzm A, CfgIzmeritel B 
WHERE A.ID_TypeIzmerit = B.ID_TypeIzmerit 
AND B.ID_Izmerit=@ID_Izmerit AND A.ForRun=0

AND ID和NamePoint(来自CfgIzmerPoint)+ CfgListGroupParIzm中来自同一CfgIzmeritel的名称,其中来自CfgIzmeritel的ID_Izmerit =来自CfgIzmerPoint的ID_Izmerit和来自CfgListGroupParIzm的ForRun - True

所以最后我需要像

这样的东西
SELECT A.ID_ListGroupParIzm, A.Name
FROM CfgListGroupParIzm A, CfgIzmeritel B 
WHERE A.ID_TypeIzmerit = B.ID_TypeIzmerit 
AND B.ID_Izmerit=@ID_Izmerit AND A.ForRun=0

UNION -- ?? 

SELECT A.ID_ListGroupParIzm, (C.Name + A.Name) AS Name
FROM CfgListGroupParIzm A, CfgIzmeritel B, CfgIzmerPoint C 
WHERE A.ID_TypeIzmerit = B.ID_TypeIzmerit 
AND B.ID_Izmerit=@ID_Izmerit AND A.ForRun=1
AND C.ID_Izmerit=@ID_Izmerit

我认为我需要使用其他一些没有Union的结构,因为我在两个选择中大致相同: - /

1 个答案:

答案 0 :(得分:1)

您可以使用UNION ALL

SELECT A.ID_ListGroupParIzm, A.Name 
FROM    CfgListGroupParIzm A, 
        CfgIzmeritel B  
WHERE   A.ID_TypeIzmerit = B.ID_TypeIzmerit  
AND     B.ID_Izmerit=@ID_Izmerit 
AND     A.ForRun=0 
UNION ALL
SELECT  A.ID_ListGroupParIzm, 
        (C.Name + A.Name) AS Name 
FROM    CfgListGroupParIzm A, CfgIzmeritel B, CfgIzmerPoint C  
WHERE   A.ID_TypeIzmerit = B.ID_TypeIzmerit  
AND     B.ID_Izmerit=@ID_Izmerit AND A.ForRun=1 
AND     C.ID_Izmerit=@ID_Izmerit 

UNION ALL将从两个查询中恢复所有结果。如果您需要不同的重复列表,请使用UNION。

查看Union vs. Union All

SQL UNION Operator

还请记住,使用A,B,C等以外的别名更合适。尝试使用稍微更具描述性的别名,以便在更大的查询中更容易理解。

如果我的假设是正确的,CfgIzmeritel和CfgIzmerPoint是一对一的你可以尝试使用

SELECT  grp.ID_ListGroupParIzm,
    CASE 
        WHEN ForRun=1 AND pnt.ID_TypeIzmerit IS NOT NULL THEN (C.Name + A.Name) 
        ELSE grp.Name
    END AS Name
FROM    CfgListGroupParIzm grp INNER JOIN
        CfgIzmeritel item ON grp.ID_TypeIzmerit = item.ID_TypeIzmerit LEFT JOIN
        CfgIzmerPoint pnt ON grp.ID_TypeIzmerit = pnt.ID_TypeIzmerit
WHERE   item.ID_Izmerit=@ID_Izmerit

从where子句中,您应该可以忽略ForRun,因为这只会在CASE语句中使用。

我认为,为了便于阅读,您应该使用UNION / UNION ALL,并且只有在性能不佳时才尝试创建单个查询(在您查看索引之后)。