我在这里有点停滞不前。我有一个简单的左外连接到一个返回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是因案例而异。
问题:
有没有办法根据区分大小写来区分连接?我不想使用UPPER
或LOWER
,因为它会破坏报告的情况。
谢谢!
在下面添加表信息,请假设所有列都被修剪为空格。
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报告的正确TenantID,我想确保我始终引入正确的租户。如果情况不同,我能写些什么来区分像John's Shop这样的情况吗?
答案 0 :(得分:9)
问题在于你的结果的第二行"约翰的 S 跳"不应该匹配"约翰的 s 跳"?
您可以使用区分大小写的排序规则。
这可能是通过更改所涉及的列的排序规则以允许使用索引来实现的,但您也可以在运行时使用明确的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而不是名字的评论可能是正确的,并且根本不需要这样做。
答案 1 :(得分:0)
如果 COLLATE
由于缺乏索引而最终变得太慢,您还可以执行以下操作,其中每个下面的 30 必须匹配每列的长度以避免无效比较。
LEFT OUTER JOIN tCash ON
TenantNumber = CashNumber
AND CONVERT(VARBINARY(30),LTRIM(RTRIM(tMoney.CashName))) = CONVERT(VARBINARY(30),LTRIM(RTRIM(Tenants.Name2)))