2015-03-13 77 views
2

正如標題所示,我試圖在具有不同值/數據類型的列上使用INNER JOIN是否有可能INNER JOIN 2不同類型/值的ID?

在一個數據庫表中,我們稱之爲表A我想要執行select語句以獲取幾列(Subject,Name,Description,Date)的值。雖然我也想要一個關係名稱。然而,問題在於關係名稱(在關係表中設置,表B)作爲字符串值(D0001001)顯示在表A中 - 因此不是字面名稱。

爲了得到字面關係名,有一個表B有一個ID列1001-1000〜和一個關係'文字'名稱列的鏈接。因此,例如在表B中,ID 1001匹配公司名稱MC DONALDS,並且在表A中RelationID是D0001001(MC DONALDS)。

不要問我爲什麼表A中的RelationID與它前面的奇怪的D000一樣,我也不知道但它有一些功能。

因此回到問題。我想從表A中獲取幾個字段,但也要從表B中的字面關係名稱中匹配表A的relationID值。

所以問題是,我怎麼能INNER JOIN這2個不同的值/類型?表A中的RelationID是字符串類型(確切地說爲nvarchar),並且在表B中與匹配關係名稱的IDInteger類型。

我想我可以解決這個問題:

  1. 在表B(1001整數)的ID匹配部分表A的RelationID(D0001001字符串)查詢做一個LIKE語句。然而,這不起作用

  2. 做一個REPLACE語句通過用nothing:「」替換RelationID'D000'值。這可能仍然需要某種類型的轉換爲表A值的整數。這裏有一些錯誤可能是因爲語法錯誤。

我有什麼至今:

SELECT 
    TableA.subject, TableA.Name, TableA.Description, TableA.Date, 
    TableB.RelationName 
INNER JOIN 
    TableB ON TableA.RelationID = TableB.ID 

這返回的轉換是不可能的(串/整數)。

於是我嘗試:

SELECT 
    TableA.subject, TableA.Name, TableA.Description, TableA.Date, 
    TableB.RelationName 
INNER JOIN 
    TableB ON TableB.ID LIKE '% TableA.RelationID %' 

這並沒有工作,要麼(EOF)。

爲了使它更清楚一點我的表:

表A + ------------ + ----------- + - ---------------- + --------------------- + ----------- + | RelationID |主題|說明|名稱|日期| + ------------ + ----------- + ------------------ + ---- ----------------- + ----------- + | D0001001 |快餐|一些描述|表單填寫名稱| 13-3-2015 | | D0001002 |飲料|一些描述|表單填寫名稱| 10-3-2015 | | D0001003 |汽車|一些描述|表單填寫名稱| 7-3-2015 | + ------------ + ----------- + ------------------ + ---- ----------------- + ----------- +

表B

+------+--------------+ 
| ID | RelationName | 
+------+--------------+ 
| 1001 | MC DONALDS | 
| 1002 | COCA COLA | 
| 1003 | MERCEDES  | 
+------+--------------+ 

- > INNER連接在ID和關係ID

任何替代品?提前致謝!

+0

您可以使用'like'構造函數 – Sim1 2015-03-13 19:21:15

+0

'D0009999'後的'RelationID'值是多少? – 2015-03-13 19:22:15

回答

4

要皈依錯誤逃生使用Substring刪除RelationID的第一個字符,然後convertRelationIDINT然後用IDJOINtableA

SELECT TableA.subject, 
     TableA.Name, 
     TableA.Description, 
     TableA.Date, 
     TableB.RelationName 
FROM tableA 
     INNER JOIN TableB 
       ON CONVERT(INT, Substring(TableA.RelationID, 2, Len(TableA.RelationID))) = TableB.ID 
+0

謝謝您的回答!每個人都有這個問題!將盡快測試。 – Nicolas 2015-03-13 19:57:26

1

不要在查詢中的LIKE語句,其中表B(1001 整數)的ID部分地匹配表A的關係ID(D0001001字符串)。 但是沒有奏效。

嘗試另一種方式圓:

SELECT TableA.Subject, 
     TableA.Name, 
     TableA.Description, 
     TableA.Date, 
     TableB.RelationName 
FROM TableA 
INNER JOIN TableB ON TableA.ID LIKE '%' + CAST(TableB.RelationID AS NVARCHAR(50)) + '%' 
1
SELECT TableA.subject, TableA.Name, TableA.Description, TableA.Date, TableB.RelationName1 
FROM TableA -- insert this line here 
INNER JOIN TableB 
ON TableB.ID LIKE '%TableA.RelationID%' 

爲了使你的第二個查詢來看,你需要從子句插入。除非這是上傳的錯誤類型,否則它應該可以正常工作,儘管它可能不會完全給你想要的東西。

如果RelationalID列總是有相同的加法,我會考慮將它從字符串中刪除。類似於:

ON TableB.ID = RIGHT(TableA.RelationalID,4) 

SQL應該將字符串轉換爲整數,以便在比較中執行隱式轉換。如果不只是添加鑄聲明:

ON TableB.ID = CAST(RIGHT(TableA.RelationalID,4) AS INT) 
1

你可以在INNER JOIN使用LIKE,但是這會減慢你的查詢性能,因爲LIKE有時使有效的索引的使用。