【发布时间】:2022-01-23 19:50:05
【问题描述】:
Table_E
| Client_ID | Name | Product |
|---|---|---|
| 2217 | John Smith | Tablet |
| 3109 | Rebecca Anderson | Phone |
| 1569 | Rajat Singh | Laptop |
表_Z
| Client_ID | City | Product_ID |
|---|---|---|
| TA 2217 | Boston | xcg153hkk |
| PH 3109 | Houston | dfr983uht |
| LT 1569 | Seattle | tty455phq |
SELECT EE.name
,EE.Product
,Left(ZZ.Product_ID,4,3)
FROM Table_e EE
Left join Table_z ZZ
On Case When EE.Product = Tablet then 'TA' + ' ' + EE.Client_ID
when EE.Product = Phone then 'PH' + ' ' + EE.Client_ID
when EE.Product = Laptop Then 'LT' + ' ' + EE.Client_ID
Else 'N/A' ON ZZ.Client_ID
要加入这两个表,我知道它位于 Client_ID 上。但是,Table_Z 上的 Client_ID 有一个前缀和一个基于您在 Table_E 中看到的产品的“空格”。此外,我想在我的“SELECT”语句中仅从表 Z 中检索 Product_ID 编号。我将如何完成此操作?正确的代码是什么样的?
【问题讨论】:
-
似乎您应该在
Table_Z中有一个没有前缀的计算列,以便您可以正确创建FOREIGN KEYCONSTRAINT。然后,您也可以轻松JOIN;作为上面的JOIN将不是 SARGable,因此不具有性能。 -
数据库规范化的东西。如果您定义
Client_ID,您应该为此保留相同的定义,并将其应用于所有使用Client_ID的表。在这种情况下,将 Table_Z 中的Client_ID拆分为Client_ID和Prefix(或类似的东西......) -
真正的问题是
Table Z,而不是JOIN。这就是需要解决的问题。一个文件应该只包含 一个 值。 Table_Z.ClientID 应该分成两列,一列包含实际的 ClientID,另一列包含产品代码 -
把人放在一张桌子上,把产品放在第二张桌子上,把购物放在第三张桌子上。
标签: sql sql-server left-join case