我有將文本附加到數值的“值”。例如 OR12345。
我們有多個表,在主表中我們有 OR12345、OR12346、OR12347 等值
輔助表只是 ID 的 INTEGER 部分,例如 12345、12346 和 12347
我嘗試了基本的 LEFT JOIN,但它只獲取一個表值。我考慮過 LIKE 通配符值,但這似乎不可行,或者至少我不知道實作該方法并創建動態選擇變數的語法。
我的基本查詢是這樣的:
SELECT
J.CurJLId, SC.OrderId, SC.ShippingMethodId, SC.SendProgressEmails
FROM
[PD_Jobs] J
LEFT JOIN
[SM_ShopCart] SC ON SC.OrderId = J.InvoiceId
WHERE
J.CurJLId > 'JL30'
AND SC.SendProgressEmails = 1
表[SM_ShopCart]:
| 訂單編號 | 發送進度電子郵件 |
|---|---|
| 或189231 | 1 |
| 或192583 | 0 |
| 或196583 | 1 |
| 或198100 | 1 |
| 或201758 | 0 |
| 或203259 | 0 |
| 或204663 | 1 |
| 或205053 | 1 |
| 或206126 | 0 |
| 或212160 | 1 |
表[PD_Jobs]:
| 發票編號 | 曲線JLId |
|---|---|
| 189231 | JL14 |
| 192583 | JL24 |
| 196583 | JL30 |
| 198100 | JL24 |
| 201758 | JL34 |
| 203259 | JL38 |
| 204663 | JL24 |
| 205053 | JL54 |
| 206126 | JL24 |
| 212160 | JL24 |
Should I be creating an embedded SELECT and then screen that to remove the 'OR'?
This is a very complicated query for my skill level. If I can get some help in the logic and proper structure it would be appreciated.
uj5u.com熱心網友回復:
連接表時,連接列的資料型別應匹配。
將 varchar 列與 int 列連接需要將一種型別轉換為另一種型別,這意味著無法進行索引查找,因為這是一個不可分割的操作;您正在強制SQL Server 在它知道是否可以連接強制轉換值之前評估每一行。
要加入您的表,您可以執行以下任一操作:
SELECT J.CurJLId, SC.OrderId, SC.SendProgressEmails
FROM PD_Jobs J
LEFT JOIN SM_ShopCart SC ON Stuff(SC.OrderId,1,2,'') = J.InvoiceId
WHERE J.CurJLId > 'JL30' and SC.SendProgressEmails = 1
SELECT J.CurJLId, SC.OrderId, SC.SendProgressEmails
FROM PD_Jobs J
LEFT JOIN SM_ShopCart SC ON SC.OrderId = Concat('OR',J.InvoiceId)
WHERE J.CurJLId > 'JL30' and SC.SendProgressEmails = 1
但是,如果性能很重要,您最好向SM_ShopCart表中添加一個持久索引計算列,以將資料型別永久固定為 int,這將允許 SQL Server 有效地連接您的表。
alter table SM_ShopCart add InvoiceId as Cast(Stuff(OrderId,1,2,'') as int) persisted
create index IX_InvoiceId on SM_ShopCart(InvoiceId) /* include (covering columns)*/
然后您的查詢可以只連接兩個表而無需資料型別轉換
SELECT J.CurJLId, SC.OrderId, SC.SendProgressEmails
FROM PD_Jobs J
LEFT JOIN SM_ShopCart SC ON SC.InvoiceId = J.InvoiceId
WHERE J.CurJLId > 'JL30' and SC.SendProgressEmails = 1
請注意,此外,您的標準J.CurJLId > 'JL30'不會按預期作業:
if 'JL30' > 'JL100' print 'oops'
uj5u.com熱心網友回復:
看看類似的東西是否有效?
SELECT J.CurJLId, SC.OrderId, SC.ShippingMethodId, SC.SendProgressEmails
FROM [PD_Jobs] J
LEFT JOIN [SM_ShopCart] SC ON SC.OrderId = 'OR' CAST(J.InvoiceId as VARCHAR)
WHERE J.CurJLId > 'JL30' AND SC.SendProgressEmails = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/439784.html
標籤:sql sql-server
