表_E
| 客戶 ID | 名稱 | 產品 |
|---|---|---|
| 2217 | 約翰·史密斯 | 藥片 |
| 3109 | 麗貝卡·安德森 | 電話 |
| 1569 | 拉賈特·辛格 | 筆記本電腦 |
表_Z
| 客戶 ID | 城市 | 產品編號 |
|---|---|---|
| TA 2217 | 波士頓 | xcg153hkk |
| PH 3109 | 休斯頓 | dfr983uht |
| LT 1569 | 西雅圖 | 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 編號。我將如何完成此操作?正確的代碼應該是什么樣的?
uj5u.com熱心網友回復:
正如Panagiotis Kanavos所提到的,前綴根本不應該存在。您正在使用前綴表示第二條資訊,但該資訊已在表中Table_E;不要這樣做。實際上,您應該完全洗掉前綴,更改資料型別并FOREIGN KEY在Client_IDin上創建約束Table_Z。修復您的設計,解決問題
如果由于某種原因您不能這樣做,則使用計算列。在以下部份我假定其ClientID在Table_E是一個int和或者是一個PRIMARY KEY或用作UNIQUE INDEX。
首先,創建新列:
ALTER TABLE dbo.Table_Z ADD Client_ID_np AS TRY_CONVERT(int,STUFF(Client_ID,1,CHARINDEX(' ',Client_ID),'')) PERSISTED;
此新列洗掉前綴并嘗試將值轉換為 an int(如果無法轉換NULL則回傳)。
然后讓我們創建FOREIGN KEY:
ALTER TABLE dbo.Table_Z ADD CONSTRAINT FK_TableZ_TableE_ClientID FOREIGN KEY (Client_ID_np) REFERENCES Table_E (ClientID);
這確保沒有無效值。如果這失敗了,那么我的假設之一是錯誤的,或者你有錯誤的資料。在繼續之前解決這個問題。
然后(在根據需要解決資料完整性問題之后)您可以進行簡單的連接:
SELECT {Your Columns}
FROM dbo.Table_E E
JOIN dbo.Table_Z Z ON E.Client_ID = Z.Client_ID_np;
uj5u.com熱心網友回復:
我認為你想要做的就是這樣。我不確定你想用 case 運算式完成什么,但如果我明白你只是想連接兩個表而不用擔心 table_z 的前綴,那么我認為你應該試試這個。
SELECT e.client_id, e.name, e.product, z.product_id
FROM table_e as e
JOIN table_z as z ON
e.client_id = SUBSTRING(z.client_id, CHARINDEX(' ', z.client_id), LEN(z.client_id))
我已經為您創建了一個 sqlfiddle 來驗證這個答案。http://sqlfiddle.com/#!18/5453ad/2/0
我現在明白上述內容對您不起作用,所以這里有一個新建議。
我會創建一個連接表來描述產品及其相關代碼,并將其稱為 product_codes 之類的東西。它看起來像這樣。
CREATE TABLE product_codes(
product varchar(20),
product_code char(2)
)
我還會更新您的 table_z 以將 client_id 和 product_code 分成單獨的欄位。這樣你就可以像這樣撰寫查詢。
SELECT e.client_id, e.name, e.product, z.product_id
FROM table_e AS e
JOIN product_codes AS pc ON e.product = pc.product
JOIN table_z AS z
ON e.client_id = z.client_id
AND pc.product_code = z.product_code
但是,我將假設您不能以任何方式更改資料庫的結構。如果是這種情況,那么您可以使用 CTE 為您的查詢創建 product_codes 表。
WITH product_codes(product, product_code) AS (
SELECT 'Laptop' as product, 'LT' as product_code
UNION
SELECT 'Phone' as product, 'PH' as product_code
UNION
SELECT 'Tablet' as produt, 'TA' as product_code
)
SELECT e.client_id, e.name, e.product, z.product_id
FROM table_e as e
JOIN product_codes pc
ON e.product = pc.product
JOIN table_z as z
ON pc.product_code ' ' CONVERT(CHAR(7), e.client_id) = z.client_id
我已經更新了 sqlfiddle 供您試用。
http://sqlfiddle.com/#!18/5453ad/11
uj5u.com熱心網友回復:
正如其他人所指出的,最好的解決方案是更改您的設計。如果這是不可能的(不是您的設計等),我建議使用 CTE 連接所需的欄位,然后加入。如果 Table_E Client_ID 欄位是INT,則需要在 CTE的運算式中使用CAST或。CONVERTCASE
DECLARE @Table_E TABLE (Client_ID VARCHAR(20), C_Name VARCHAR(50), Product VARCHAR(20))
INSERT INTO @Table_E
VALUES
(2217, 'John Smith', 'Tablet'),
(3109, 'Rebecca Anderson', 'Phone'),
(1569, 'Rajat Singh', 'Laptop')
DECLARE @Table_Z TABLE (Client_ID VARCHAR(20), City VARCHAR(20), Product_ID VARCHAR(20))
INSERT INTO @Table_Z
VALUES
('TA 2217', 'Boston', 'xcg153hkk'),
('PH 3109', 'Houston', 'dfr983uht'),
('LT 1569', 'Seattle', 'tty455phq');
WITH Client_IDZ AS
(
SELECT Client_ID,
C_Name,
Product,
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 NULL END AS Client_IDZ
FROM @Table_E EE
)
SELECT EE.C_Name
,EE.Product
,ZZ.Product_ID
FROM Client_IDZ EE
LEFT JOIN @Table_z ZZ ON EE.Client_IDZ = ZZ.Client_ID
| 名稱 | 產品 | 產品編號 |
|---|---|---|
| 約翰·史密斯 | 藥片 | xcg153hkk |
| 麗貝卡·安德森 | 電話 | dfr983uht |
| 拉賈特·辛格 | 筆記本電腦 | tty455phq |
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/390531.html
標籤:sql sql-server 左连接 案件
