【问题标题】:How can I compare SQL entries with the same beginning and different endings?如何比较具有相同开头和不同结尾的 SQL 条目?
【发布时间】:2018-07-12 18:59:04
【问题描述】:

基本上,我要比较的行的格式有点像这样: [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

【问题讨论】:

  • 您能提供一些示例数据并期待结果吗?
  • 如果您知道要比较多少个字符,您可以使用 LEFT 或 SUBSTRING,如此处所述docs.microsoft.com/en-us/sql/t-sql/functions/…
  • @D Shih - 假设我在下面的数据集中有五个表格。它将循环并仅返回前两个,因为它们都是 AB_01_01,但是两个不同的版本。 Gordon Linoff 在下面的查询似乎找到了正确的信息。我可能需要稍微调整一下以说明我需要收集的更多信息,但它有我需要的比较。 AB_01_01_01_05 AB_01_01_05_16 CD_01_01_01_12 AB_06_28_01_11 JJ_72_01_01_05

标签: sql sql-server


【解决方案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;

【讨论】:

  • 是的,这看起来像它的工作。我系统中的一些表单在版本日期之后有后缀,但现在就足够了。
  • @Gordon Linoff,我们可以使用计算列,而不是将 Left 函数放在连接条件中,因为如果这些列有可用的索引,那么 SQL 优化器将不会使用索引。
  • @RGS 。 . .带索引的计算列绝对是提高性能的好解决方案。
【解决方案2】:

如果表格跟在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
)

【讨论】:

    【解决方案3】:

    这个查询不容易写的原因是因为你描述的数据结构违反了第一范式。您有一个表单代码和一个版本组合到一个列中。我不确定你是否可以灵活地修改架构,但如果你这样做了,你应该考虑将这两个值分成两个不同的列。通过此更改,您可以简单地加入相同的表单代码。

    如果您无法更改架构,但可以创建临时表,那么如果您有很多工作要做,您可以考虑将这两个值解析为临时表中的两个单独的列。如果你编写一个内部连接来比较两边的子字符串,你实际上是在删除 SQL Server 使用你可能拥有的任何索引的任何能力。查询几乎可以保证以 O(n^2) 运行,其中 n 是 Forms 表中的记录数。如果表只有几条记录,您将不会注意到它。如果它有很多,它会很慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多