2010-02-16 62 views
0

这里是一个结构: -/ alt text http://s004.radikal.ru/i207/1002/79/ed7ac0a97d0b.jpg 所以我需要选择 ID,并使用类型从CfgListGroupParIzm名称为CfgIzmeritel何ForRun - 假 它选择组。案例ForRun?

SELECT A.ID_ListGroupParIzm, A.Name 
FROM CfgListGroupParIzm A, CfgIzmeritel B 
WHERE A.ID_TypeIzmerit = B.ID_TypeIzmerit 
AND [email protected]_Izmerit AND A.ForRun=0 

ID和NamePoint(从CfgIzmerPoint )+从CfgListGroupParIzm来自同一CfgIzmeritel名在ID_Izmerit从CfgIzmeritel = ID_Izmerit从CfgListGroupParIzm CfgIzmerPoint和ForRun - 真

所以最后我需要像

SELECT A.ID_ListGroupParIzm, A.Name 
FROM CfgListGroupParIzm A, CfgIzmeritel B 
WHERE A.ID_TypeIzmerit = B.ID_TypeIzmerit 
AND [email protected]_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 [email protected]_Izmerit AND A.ForRun=1 
AND [email protected]_Izmerit 

我想我需要使用一些其他建筑没有联盟,因为我做出几乎相同的两个选择: -/

回答

1

你可以使用UNION ALL

SELECT A.ID_ListGroupParIzm, A.Name 
FROM CfgListGroupParIzm A, 
     CfgIzmeritel B 
WHERE A.ID_TypeIzmerit = B.ID_TypeIzmerit 
AND  [email protected]_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  [email protected]_Izmerit AND A.ForRun=1 
AND  [email protected]_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 [email protected]_Izmerit 

从你应该能够忽略ForRun where子句,因为这只会在使用CASE声明。

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

+0

对别名达成了一致,但是工会和工会在这里有什么不同?有没有什么办法可以在一个选择中做出来。 。 。 – Cynede

+0

从我在第二个查询中可以看到的情况来看,CfgIzmeritel和CfgIzmerPoint之间存在1:1的关系(我在CfgIzmerPoint中看不到任何联接),因此对于ForRun = 1,您正在实施INNER JOIN,而不是在第一个查询中这样做。这使得在一个查询中创建它有点困难。 –

+0

不是一对一的,在一个CfgIzmeritel上有很多点......我想我也需要在这里选择他们的ID或null如果这是CfgIzmeritel也CfgIzmerPoint没有ID_TypeIzmerit。 。 。 – Cynede