这是一个结构: - / 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的结构,因为我在两个选择中大致相同: - /
答案 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。
还请记住,使用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,并且只有在性能不佳时才尝试创建单个查询(在您查看索引之后)。