【问题标题】:How to use Substring in left outer join如何在左外连接中使用子字符串
【发布时间】:2022-01-20 03:48:11
【问题描述】:

我尝试使用左外连接中的子字符串将这两个表与 ALTERNATE_ID 连接起来,但它不起作用。有人可以建议我怎么做。 这里Table1是主表,

SELECT
tab1.USER_NAME,
tab2.ALTERNATE_ID as 'Contract_no'

FROM TABLE1 tab1

LEFT OUTER JOIN TABLE2 tab2 ON Table2.ALTERNATE_ID = SUBSTRING(tab1.ALTERNATE_ID,0,CHARINDEX('/',tab1.ALTERNATE_ID)

表 1:

ALTERNATE_ID 100-0000053-001/0001

表2

ALTERNATE_ID 100-0000053-001

【问题讨论】:

  • 加入子串列?桌子小吗,否则会超级慢。
  • 你必须从'/'位置数中减去1。子串('100-0000053-001/0001', 1, CHARINDEX('/','100-0000053-001/0001')-1)
  • ON tab1.ALTERNATE_ID LIKE CONCAT(tab2.ALTERNATE_ID, '/%')
  • 只标记您使用的数据库。
  • @AntonGrig,我在列中使用了它,它工作正常,但在加入时它不起作用 Substring('100-0000053-001/0001', 1, CHARINDEX('/','100- 0000053-001/0001')-1) 有什么办法可以连接这两个表,因为这两个表之间没有其他公共列

标签: sql left-join


【解决方案1】:

您必须使用从第一个字符到 \ - 1 位置的子字符串 但是如果你必须基于列的一部分加入,那么你应该在子字符串部分创建索引。

SELECT
tab1.USER_NAME,
tab2.ALTERNATE_ID as 'Contract_no'
FROM TABLE1 tab1
LEFT OUTER JOIN TABLE2 tab2 
ON Table2.ALTERNATE_ID 
= 
SUBSTRING(tab1.ALTERNATE_ID,1,CHARINDEX('/',tab1.ALTERNATE_ID-1)

【讨论】:

  • 我已经尝试过这个,但由于传递给左侧或子字符串函数的长度参数无效而出现错误。
【解决方案2】:

您也可以使用 SUBSTRING_INDEX 来分割字符串,如下所示:

SELECT tab1.USER_NAME, tab2.ALTERNATE_ID as 'Contract_no'
FROM TABLE1 tab1
LEFT OUTER JOIN TABLE2 tab2 
ON Table2.ALTERNATE_ID = SUBSTRING_INDEX(tab1.ALTERNATE_ID, "/", 1);

【讨论】:

  • 我正在使用 SQL server,SQL server 中的 SUBSTRING_INDEX 有什么替代方法
  • 对不起,我没有看到标签
【解决方案3】:

您可以通过以下方式使用OUTER APPLY

SELECT
tab1.USER_NAME,
tab2.ALTERNATE_ID as 'Contract_no'
FROM TABLE1 tab1
OUTER APPLY (Select ALTERNATE_ID 
             From TABLE2 
             Where ALTERNATE_ID=SUBSTRING(tab1.ALTERNATE_ID,1,CHARINDEX('/',tab1.ALTERNATE_ID)-1)) As tab2

【讨论】:

    【解决方案4】:

    如果你使用PATINDEX,那么很容易得到斜线前数字的位置。

    SELECT *
    FROM TABLE1 t1
    LEFT JOIN TABLE2 t2 
      ON t2.ALTERNATE_ID = LEFT(t1.ALTERNATE_ID, PATINDEX('%[0-9]/%', t1.ALTERNATE_ID))
    

    或者换个角度看,Table1的和Table2的一样

    SELECT *
    FROM TABLE1 t1
    LEFT JOIN TABLE2 t2 
      ON t1.ALTERNATE_ID LIKE t2.ALTERNATE_ID+'/%'
    

    dbfiddle here

    上的演示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多