【问题标题】:SQL Join on partial column data (SQL Server)对部分列数据进行 SQL 联接 (SQL Server)
【发布时间】:2016-06-10 20:12:57
【问题描述】:

如果重要的话,两列都是tinyint

表 1

Version
--------
111115
222226
333337

表2

ID  Year
--------
5   2015
6   2016
7   2017

如果它等于表 1 中版本字段中的最后一个值,我需要加入表 2 中的 ID。

版本 111115 将加入 ID 5。我知道如何选择这样的东西,但加入是否可行?结果是:

111115  5  2015

TIA!

【问题讨论】:

  • 您可以加入对字段所做的任何修改,但会影响性能。因此,如果您愿意,可以加入 SUBSTRING(table1.Version, len(version)-1, 1) = Table2.ID。很可能会很慢。更好的选择是将其放入临时表中,方法是选择子字符串和版本,然后将其加入 Table2
  • TABLE2.ID 的值是否会大于 9?到目前为止,没有一个答案能解决这种情况。

标签: sql sql-server join


【解决方案1】:

您可以使用RIGHT() 函数来执行此操作:

SELECT *
FROM Table1 A
INNER JOIN Table2 B on RIGHT(A.Version,1) = B.ID

不过,我可能会避免这样做。这是一个错误的数据库设计。或许在表 1 中添加一列 ID,然后使用:

UPDATE Table1
SET ID = RIGHT(Version,1)

【讨论】:

    【解决方案2】:

    由于它们都是整数,您可以尝试取模运算符。它取除法后的余数。所以111115 % 10 是 5。

    SELECT *
    FROM Table1 t1
    INNER JOIN Table2 t2 on t1.Version % 10 = t2.ID
    

    【讨论】:

      【解决方案3】:
      Declare @tblTest as table
      (
          id INT,
          yearName INT
      )
      
      
      Declare @tblVersion as table
      (
          VersionNo INT
      )
      
      INSERT INTO @tblTest values(5,2015)
      INSERT INTO @tblTest values(6,2016)
      INSERT INTO @tblTest values(7,2017)
      
      INSERT INTO @tblVersion values(111115)
      INSERT INTO @tblVersion values(111116)
      INSERT INTO @tblVersion values(111117)
      
      
      select 
      *,RIGHT(VersionNo,1) 
      from @tblVersion
      
      SELECT 
      *
      FROM @tblTest T1 
      LEFT JOIN (SELECT RIGHT(VersionNo,1) AS VersionId,VersionNo FROM @tblVersion) T2 ON T2.VersionId=T1.id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-18
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        相关资源
        最近更新 更多