【问题标题】:Case Sensitive join TSQL区分大小写的连接 SQL
【发布时间】:2016-08-28 18:30:53
【问题描述】:

我在这里有点停滞不前。我有一个简单的左外连接到一个返回 ID 的表。

我的代码是

Select distinct TenantID
,Name
,Name2
,TenantNumber
,Cashname 
From Tenants 
LEFT OUTER JOIN tCash 
on TenantNumber = CashNumber 
and tMoney.CashName = Tenants.Name2

我的结果集如下:

**TenantID | Name      | Name2          | TenantNo | CashName**

100      |MyShop     | John's shop    | 12345    |John's shop

999      |MyShop     | John's Shop    | 12345    |John's shop

我的问题:出于所有意图和目的,“John's shop”与“John's Shop”不同 - 我在 TenantNo 和 Name2 上正确地加入了我的钱表,但名称 2 是因大小写而异。

问题: 有没有办法根据区分大小写来区分连接?我不想使用UPPERLOWER,因为它会破坏报告的案例。

谢谢!

在下面添加表格信息,请假设所有列都被删除了空格。

tMoney

CashNumnbr |  CashName
102504       Bill's Place     

102374       Tom's Shop      

12345        John's Shop

12345        John's shop

租户

   TenantID | Name     | Name2            |TenantNumber 

  1         |MyShop    | John's Shop     | 12345

  2         |MyShop    | John's shop     | 12345

  3         |Shoppee   |  Bill's Place   | 102504        

  4         | Shop2    | Toms Shop      | 102374        

由于我想加入以获得 AR 报告的正确租户 ID,因此我想确保我始终引入正确的租户。如果情况不同,我能写什么来区分像约翰的商店这样的情况吗?

【问题讨论】:

  • 尝试修剪前导和尾随空格或确认两个值的长度/数据长度
  • 我正在修剪 Name2 和 TenantNumber。如上所示,它仍然会产生 2 行。
  • 请提供来自 tCash 和租户的数据
  • 太糟糕了。如果您能提供帮助,您可能应该更改您的 tCash 列以使用tenantId,而不是商店的名称
  • 一个租户可以有多个 Name2 的变体并且有相同的 TenantNumber。因此,对于报告,我们希望引入正确的租户 ID。例如,租约 100、101、102 有租户 John's Shop、John's shop 和 J's Shop。我们可以假设他们都是同一个所有者/租户,所以他们有 = TenantNumber。这可能发生在商业世界中的别名或 DBA 方面。我不喜欢这种理性,但事实就是如此。因此,我知道唯一的名称有 = Tenant#s 但不同的 TenantID...以及不同的租约等。@MartinSmith

标签: sql-server tsql join


【解决方案1】:

问题是,在结果的第二行中,“John's Shop”不应该与“John's shop”匹配?

您可以使用区分大小写的排序规则。

这可能最好通过更改所涉及的列的排序规则以允许使用索引来实现,但您也可以在运行时使用明确的COLLATE 子句来实现,如下所示。

SELECT DISTINCT TenantID,
                Name,
                Name2,
                TenantNumber,
                Cashname
FROM   Tenants
       LEFT OUTER JOIN tCash
         ON TenantNumber = CashNumber
            AND tMoney.CashName = Tenants.Name2 COLLATE Latin1_General_100_CS_AS 

关于加入 id 而不是 name 的 cmets 可能是正确的,并且完全不需要这样做。

【讨论】:

  • 这很有趣。我完全不知道字符串比较不区分大小写。
  • @CathalMF - 这取决于排序规则,但如果您在安装时只接受默认值并且从不明确设置数据库或列排序规则,那么您最终会得到不区分大小写的排序规则。
【解决方案2】:

如果COLLATE 因缺少索引而导致速度过慢,您还可以执行以下操作,其中以下每 30 个必须匹配每列的长度以避免无效比较。

LEFT OUTER JOIN tCash ON 
    TenantNumber = CashNumber
    AND CONVERT(VARBINARY(30),LTRIM(RTRIM(tMoney.CashName))) = CONVERT(VARBINARY(30),LTRIM(RTRIM(Tenants.Name2)))

【讨论】:

    猜你喜欢
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多