id dept Person Rating
-------------------------------------------
1 ece p1 R1
2 ece p2 t1
3 eee P3 R2
4 eee p4 M
5 Civil P5 R2
6 Civil P6 t2
7 Civil P7 t2
8 Mech p8 R2
9 Mech P9 Null
10 IT P10 R2J
11 IT P11 T2
12 IT P12 T2
我想获取所有在dept中的评级为null或在dept中的评级为M或“ t”评级与在dept中的“ P”评级不同的dept行。
所需的输出:
3 eee P3 R2
4 eee p4 M
8 Mech p8 R2
9 Mech P9 Null
10 IT P10 R2J
11 IT P11 T2
12 IT P12 T2
注1::“ t”等级与部门中的“ R”等级不同,这意味着如果某部门中的人员等级为R2,则其他部门中的人员等级为T1。 示例部门。
注2::“ t”等级与部门中的“ R”等级相同,这意味着如果某个部门中的人员等级为R1,则其他部门中的人员等级为T1。 示例部门 ECE 。
谢谢。
答案 0 :(得分:0)
如果我没错,您可以在另一个EXISTS
中使用EXISTS
。
SELECT *
FROM elbat t1
WHERE EXISTS (SELECT *
FROM elbat t2
WHERE t2.dept = t1.dept
AND (t2.rating IS NULL
OR t2.rating = 'M'
OR t2.rating LIKE 'T%'
AND EXISTS (SELECT *
FROM elbat t3
WHERE t3.dept = t2.dept
AND t3.rating LIKE 'R%'
AND right(t2.rating, len(t2.rating) - 1) <> right(t3.rating, len(t3.rating) - 1))));
答案 1 :(得分:0)
(从您的另一个问题中,我怀疑您是否理解答复,反正我希望您至少尝试一下)
Select * from myTable t1
where exists (
select * from myTable t2
where t1.dept = t2.dept AND
(t2.rating = 'M' or
t2.rating is null or
right(t1.Rating,1) <> right(t2.Rating,1))
);
答案 2 :(得分:0)
您可以使用联合,然后对部门进行自联接以获取结果
SELECT id, dept, Person, Rating FROM Test
WHERE Rating IS NULL OR Rating = 'M'
UNION
SELECT t1.id, t1.dept, t1.Person, t1.Rating
FROM Test t1
INNER JOIN Test t2 ON
t1.dept = t2.dept
WHERE
RIGHT(ISNULL(t1.Rating,0),1) <> RIGHT(ISNULL(t2.Rating,0),1)
这里是demo
答案 3 :(得分:0)
如果我做对了,要返回记录,评分必须为M
或NULL
,或者必须以R
或T
开头。评分的开头字母R
和T
被视为相等,并且如果满足该条件,则该部门中至少有一个其他人必须具有不同的评分(不是以{{ 1}}或R
或具有不同的RT评级)。如果正确,则以下查询将返回所需结果:
T