我有一个单位表,如下所示:
我正在使用以下查询返回搜索结果,但它为alt单位创建了单独的行。
SELECT U.unit_id as primary_unit_id, U.unit_name as primary_unit,
alt_id1 = (select top 1 unit_id from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=1),
alt_unit1 = (select top 1 unit_name from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=1),
alt_conversion1 = (select top 1 conversion from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=1),
alt_id2 = (select top 1 unit_id from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=2),
alt_unit2 = (select top 1 unit_name from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=2),
alt_conversion2 = (select top 1 conversion from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=2),
alt_id3 = (select top 1 unit_id from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=3),
alt_unit3 = (select top 1 unit_name from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=3),
alt_conversion3 = (select top 1 conversion from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=3),
alt_id4 = (select top 1 unit_id from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=4),
alt_unit4 = (select top 1 unit_name from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=4),
alt_conversion4 = (select top 1 conversion from T_DX_UNITS where alt_of=U.unit_id and alt_sort_no=4)
FROM T_DX_UNITS U
WHERE --U.alt_of IS NULL AND
(U.unit_name LIKE @keyword + '%' OR U.unit_name LIKE '%' + @keyword + '%')
给出以下输出:(第一行是正确的,它也显示了alt单位,但它还显示了alt单位的单独行)
答案 0 :(得分:3)
只是一个猜测。可能您还需要一些基本单位,这些单位本身并不满足过滤器的要求,但其中一些替代单位确实可以满足。
DECLARE @keyword nvarchar(10) = 'unit';
WITH alts AS (
SELECT [unit_id], [unit_name], [conversion],[alt_of], [alt_sort_no]
FROM T_DX_UNITS
WHERE alt_of IS NOT NULL AND unit_name LIKE '%' + @keyword + '%'
)
SELECT U.unit_id as primary_unit_id, U.unit_name as primary_unit,
alt_id1,
alt_unit1,
alt_conversion1,
alt_id2,
alt_unit2 ,
alt_conversion2,
alt_id3,
alt_unit3,
alt_conversion3
alt_id4,
alt_unit4,
alt_conversion4
FROM T_DX_UNITS U
CROSS APPLY (
SELECT
alt_id1 = (select top 1 unit_id from alts a where a.alt_of=U.unit_id and a.alt_sort_no=1),
alt_unit1 = (select top 1 unit_name from alts a where a.alt_of=U.unit_id and a.alt_sort_no=1),
alt_conversion1 =(select top 1 conversion from alts a where a.alt_of=U.unit_id and a.alt_sort_no=1),
alt_id2 = (select top 1 unit_id from alts a where a.alt_of=U.unit_id and a.alt_sort_no=2),
alt_unit2 = (select top 1 unit_name from alts a where a.alt_of=U.unit_id and a.alt_sort_no=2),
alt_conversion2 =(select top 1 conversion from alts a where a.alt_of=U.unit_id and a.alt_sort_no=2),
alt_id3 = (select top 1 unit_id from alts a where a.alt_of=U.unit_id and a.alt_sort_no=3),
alt_unit3 = (select top 1 unit_name from alts a where a.alt_of=U.unit_id and a.alt_sort_no=3),
alt_conversion3 =(select top 1 conversion from alts a where a.alt_of=U.unit_id and a.alt_sort_no=3),
alt_id4 = (select top 1 unit_id from alts a where a.alt_of=U.unit_id and a.alt_sort_no=4),
alt_unit4 = (select top 1 unit_name from alts a where a.alt_of=U.unit_id and a.alt_sort_no=4),
alt_conversion4 =(select top 1 conversion from alts a where a.alt_of=U.unit_id and a.alt_sort_no=4)
) t
WHERE U.alt_of IS NULL
AND (U.unit_name LIKE '%' + @keyword + '%'
OR coalesce(t.alt_id1, t.alt_id2, t.alt_id3, t.alt_id4) IS NOT NULL)