在SQL Server中选择记录而不进行排序

9 浏览
0 Comments

在SQL Server中选择记录而不进行排序

我有一张名为TempImport的表,所选择的查询结果如图所示。但我想要按照tempImport表中代码的顺序来获取结果,使用SQL Server。

查询语句如下:

SELECT DISTINCT Code,
    (dd.dd_receipt_no)
FROM   TempImport tm WITH(NOLOCK)
    INNER JOIN depositor_mast dm WITH(NOLOCK)
            ON  tm.Code = dm.dm_code
    INNER JOIN deposit_detl dd WITH(NOLOCK)
            ON  dm.dm_srno = dd.dd_dm_srno
WHERE  dd.dd_dt_code IN ('PDFP', 'PDFD', 'PDFE')
    AND tm.Remark = 'OK'
    AND dm.dm_dep_ind = 'PDEP'
    AND dd.dd_delind = 'L'
    AND dd.dd_exit_date = 0
    AND (dd.Certificate_No = '' OR dd.Certificate_No IS NULL)

图中显示了TempImport、选择的结果和所需的结果

0
0 Comments

问题的原因是需要按特定顺序选择记录,但是在SQL Server中没有直接选择而不排序的方法。目前存在几种解决方法,但都不太理想。

第一种方法是创建一个包含排序依据和排序顺序列的辅助表。由于无法修改原始表,所以可以创建一个常规表或临时表来实现。这种方法绕过了不能修改tempImport表的限制,但是需要额外的空间和维护工作。

第二种方法是编写一个逐行处理的查询,通过迭代自定义排序顺序中的值来实现。对于少量记录来说,这种方法可以正常工作,但是当表的规模变大时,查询的性能将变得无法接受。基本上,查询的语句将类似于:

SELECT a,b,c 
FROM ......<your stuff here>.... 
...<more of your stuff>...
ORDER BY CASE a 
WHEN 'G05198' THEN 1
WHEN 'K10739' THEN 2
WHEN 'B11737' THEN 3 
ELSE a
END

可以使用参数来优化这个查询,使其更具鲁棒性,但是基本原理不变:逐行处理的查询在数据集变大时性能会受到影响。也许这种方法可以帮助你争取一些时间,以便说服相关人员修改模式,从而摆脱这个问题。

但是如果tempImport表中有超过1000条记录,以上的查询方法将无法使用。可以根据我的帖子中的指示,修改查询以使用参数化的case评估,从tempImport表的列中获取排序顺序,而不是在示例中硬编码。如果有时间,我会写一个示例,但是你应该能在网上找到现成的例子。无论如何,这种逐行处理的查询方法是不可持续的。性能最终会降低到无法接受的程度,你将需要另一种解决方案。建议尝试第一种方法,即修改原始表或者采用其他完全不同的方法。

0