34,587
社区成员
发帖
与我相关
我的任务
分享
select ck.RULESET_ID,
(case when r.id is null then ru.id else r.id end)as rule_id,
ck.yl_dj,
(case when r.name is null then ru.name else r.name end)as rulename,
s.note as setnote,ck.yl_wg,yl_sl,yl_sfe
from [ztb1010_1000_Y_2_1004] ck
left join [ruleset] s on s.id = ck.ruleset_id
left join [rules] r on r.id = s.rule_id
left join [rules] ru on ru.id = ck.ruleset_id
where 1=1 and (r.id = '8b8b8bd45b235a35015b23735135001f' or ck.ruleset_id = '8b8b8bd45b235a35015b23735135001f')
union all
select ck.RULESET_ID,
(case when r.id is null then ru.id else r.id end)as rule_id,ck.yl_dj,
(case when r.name is null then ru.name else r.name end)as rulename,
s.note as setnote,ck.yl_wg,yl_sl,yl_sfe
from [ztb1010_1001_Y_2_1004] ck
left join [ruleset] s on s.id = ck.ruleset_id
left join [rules] r on r.id = s.rule_id
left join [rules] ru on ru.id = ck.ruleset_id
where 1=1 and (r.id = '8b8b8bd45b235a35015b23735135001f' or ck.ruleset_id = '8b8b8bd45b235a35015b23735135001f')
union all
select ck.RULESET_ID,
(case when r.id is null then ru.id else r.id end)as rule_id,ck.yl_dj,
(case when r.name is null then ru.name else r.name end)as rulename,
s.note as setnote,ck.yl_wg,yl_sl,yl_sfe
from [ztb1010_1002_Y_2_1004] ck
left join [ruleset] s on s.id = ck.ruleset_id
left join [rules] r on r.id = s.rule_id
left join [rules] ru on ru.id = ck.ruleset_id
where 1=1 and (r.id = '8b8b8bd45b235a35015b23735135001f' or ck.ruleset_id = '8b8b8bd45b235a35015b23735135001f')
SELECT *
FROM [ztb1010_1000_Y_2_1004] ck
LEFT JOIN [rules] ru ON ru.id = ck.ruleset_id
WHERE 1 = 1
AND ( r.id = '8b8b8bd45b235a35015b23735135001f'
OR ck.ruleset_id = '8b8b8bd45b235a35015b23735135001f'
)
不过逻辑是不是一样的要自己确认下[/quote]
先放到cte里边会比直接连接慢?没注意过,我想放到外边主要是楼主用了两次这个cte里边的东西,然后分别join了一个表,我看大概可以cte join tab1 join tab2 这样写[/quote]
也不是说先放cte比较慢,是说这些表ztb1010_1001_Y_2_1004 ,如果数据量比较大,直接查出所有的数据,可能会影响性能。因为在下面的join里面本身是有筛选条件的,筛选用到了索引的话是很快的。那你全部都查出来,肯定是走的全表扫描。
[/quote]
恩索引这方面没考虑到,确实可能会有这个问题,那这样的话,这单独三个表就拿不出了,除了where ,还有关联的on更是在where之前就可以筛选掉一大部分,还得带着join的表会更好[/quote]
我把数据做成临时表还是很慢 ,不知道怎么改了 SELECT *
FROM [ztb1010_1000_Y_2_1004] ck
LEFT JOIN [rules] ru ON ru.id = ck.ruleset_id
WHERE 1 = 1
AND ( r.id = '8b8b8bd45b235a35015b23735135001f'
OR ck.ruleset_id = '8b8b8bd45b235a35015b23735135001f'
)
不过逻辑是不是一样的要自己确认下[/quote]
先放到cte里边会比直接连接慢?没注意过,我想放到外边主要是楼主用了两次这个cte里边的东西,然后分别join了一个表,我看大概可以cte join tab1 join tab2 这样写[/quote]
也不是说先放cte比较慢,是说这些表ztb1010_1001_Y_2_1004 ,如果数据量比较大,直接查出所有的数据,可能会影响性能。因为在下面的join里面本身是有筛选条件的,筛选用到了索引的话是很快的。那你全部都查出来,肯定是走的全表扫描。
[/quote]
恩索引这方面没考虑到,确实可能会有这个问题,那这样的话,这单独三个表就拿不出了,除了where ,还有关联的on更是在where之前就可以筛选掉一大部分,还得带着join的表会更好SELECT *
FROM [ztb1010_1000_Y_2_1004] ck
LEFT JOIN [rules] ru ON ru.id = ck.ruleset_id
WHERE 1 = 1
AND ( r.id = '8b8b8bd45b235a35015b23735135001f'
OR ck.ruleset_id = '8b8b8bd45b235a35015b23735135001f'
)
不过逻辑是不是一样的要自己确认下[/quote]
先放到cte里边会比直接连接慢?没注意过,我想放到外边主要是楼主用了两次这个cte里边的东西,然后分别join了一个表,我看大概可以cte join tab1 join tab2 这样写[/quote]
也不是说先放cte比较慢,是说这些表ztb1010_1001_Y_2_1004 ,如果数据量比较大,直接查出所有的数据,可能会影响性能。因为在下面的join里面本身是有筛选条件的,筛选用到了索引的话是很快的。那你全部都查出来,肯定是走的全表扫描。
SELECT *
FROM [ztb1010_1000_Y_2_1004] ck
LEFT JOIN [rules] ru ON ru.id = ck.ruleset_id
WHERE 1 = 1
AND ( r.id = '8b8b8bd45b235a35015b23735135001f'
OR ck.ruleset_id = '8b8b8bd45b235a35015b23735135001f'
)
不过逻辑是不是一样的要自己确认下[/quote]
先放到cte里边会比直接连接慢?没注意过,我想放到外边主要是楼主用了两次这个cte里边的东西,然后分别join了一个表,我看大概可以cte join tab1 join tab2 这样写SELECT *
FROM [ztb1010_1000_Y_2_1004] ck
LEFT JOIN [rules] ru ON ru.id = ck.ruleset_id
WHERE 1 = 1
AND ( r.id = '8b8b8bd45b235a35015b23735135001f'
OR ck.ruleset_id = '8b8b8bd45b235a35015b23735135001f'
)
不过逻辑是不是一样的要自己确认下