如何比较具有相同开头和不同结尾的SQL条目?

时间:2018-07-12 18:59:04

标签: sql sql-server

基本上,我要比较的行的格式如下:  [Form Code] _ [Version Date(mm / yy)]。

更新表单时,它们使用相同的代码,但是会更改版本日期以反映其生效时间。因此,您可能会看到Example_Code_12_01,然后将其替换为Example_Code_12_17。

我想做的是编写一个SQL Server查询,该查询将遍历这些表单中的每一个,所有表单的表单代码都不同,并返回两个具有相同代码但版本日期不同的表单。

我当时认为这很可能是这样:

select a.FullFormName, b.FullFormName
from Forms a
join Forms b on --here is where the logic for the compare would go--
where a.FullFormName != b.FullFormName
--The above is to make sure it doesn't return the same exact form twice

3 个答案:

答案 0 :(得分:1)

您似乎希望不使用最后6个字符进行比较:

select a.FullFormName, b.FullFormName
from Forms a join
     Forms b
     on left(a.FullFormName, len(a.FullFormName) - 6) = left(b.FullFormName, len(b.FullFormName) - 6)  --here is where the logic for the compare would go--
where a.FullFormName <> b.FullFormName;

答案 1 :(得分:0)

如果表单遵循VersionCode_mm_yy

SELECT * FROM Table
WHERE SUBSTRING(Code, 1, CHARINDEX('_',Code,1)) IN 
(
    SELECT SUBSTRING(Code, 1, CHARINDEX('_',Code,1)) 
    FROM Table
    GROUP BY SUBSTRING(Code, 1, CHARINDEX('_',Code,1))
    HAVING COUNT(DISTINCT (Code)) > 1
)

答案 2 :(得分:0)

该查询不容易编写的原因是,您描述的数据结构违反了第一种标准格式。您将一个表单代码和一个版本合并到单个列中。我不确定是否可以灵活地修改架构,但是如果这样做,则应考虑将这两个值分成两个不同的列。进行此更改后,您只需加入相等的表单代码即可。

如果您无法更改架构,但可以创建临时表,则可能需要考虑将这两个值解析为临时表中的两个单独的列。如果编写一个内部联接比较两端的子字符串,则实际上将删除SQL Server使用可能具有的任何索引的任何功能。该查询几乎可以保证以O(n ^ 2)运行,其中n是Forms表中的记录数。如果表格只有几条记录,您将不会注意到它。如果数量很多,它将非常缓慢。