我有这张桌子:
std_id std_type std_dept target
1 type-1 ALL 15
2 type-1 HRD 10
3 type-2 ALL 1
4 type-2 ACCTG 5
5 type-3 ALL 5
6 type-4 ALL 25
std_dept
的 ALL
表示std_target
std_type
对所有部门有效
std_dept
覆盖值表单点(1)。
所以,我的问题是我可以说我来自HRD
部门,我希望得到如下结果:
std_id std_type std_dept target
2 type-1 HRD 10
3 type-2 ALL 1
5 type-3 ALL 5
6 type-4 ALL 25
我非常想展示我的作品,但我根本不知道,我不知道如何明确select * from std_table (for each std_type) where std_dept='HRD' if exist else get from std_dept='ALL'
。
如果不是代码,我需要指针
答案 0 :(得分:0)
您可以使用NOT EXISTS
和相关子查询:
SELECT *
FROM tab
WHERE std_dept = 'HRD'
UNION ALL
SELECT *
FROM tab t1
WHERE std_dept = 'ALL'
AND NOT EXISTS (SELECT *
FROM tab t2
WHERE t2.std_dept = 'HRD'
AND t1.std_type = t2.std_type);
<强> DBFiddle Demo 强>
答案 1 :(得分:0)
听起来你想要加权,所以如果你从HRD那里得到HRD或ALL,如果你想要ACCTG那么你想要ACCTG或ALL,对于1-4型。
您可以按std_type进行分组以使它们不同,并按顺序排序以使订单正确。对于加权事物,您可以创建一个列,该列是与您在WHERE子句中使用的相同值进行比较的结果,例如:类似的东西:
SELECT std_id, DISTINCT(std_type) AS std_type,
std_dept, target,
IF (std_dept = 'HRD', 50, 10) AS weight
FROM mytable
WHERE std_dept IN ('ALL', 'HRD')
GROUP BY std_id, std_dept, target, weight
ORDER BY std_type