2016-03-04 77 views
1

說我有如下表(ID & ID2是PK/FK分別),我將如何爲每個設計這兩次翻出detailTable.name列的查詢,一旦第一張表中有IDSQL選擇 - 返回兩次基於ID的同一列的另一個表

我期望的結果集將是這樣的:

+------+--------+------+---------+ 
| Name | Name 2 | Code | Created | 
+------+--------+------+---------+ 
| Dave | Steven | AAAA | 1/10/10 | 
+------+--------+------+---------+ 

我已經嘗試了兩個這樣的聯接,但不斷收到此錯誤:

SELECT 
     DT.name as [Name 1], 
     DT.name as [Name 2] 
     --other columns would go here 

FROM linkTable LT 

LEFT JOIN 
    detailTable DT 
    ON LT.id2 = DT.id 
LEFT JOIN 
    linkTable LT2 
    ON LT2.id = DT.id 
where DT.id = '74' 

錯誤:錯誤轉換數據類型爲nvarchar to bigint

linkTable

+-----+-------+--------+-------------------------+-----------+ 
| ID | ID2 | Code | Created     | CreatedBy | 
+-----+-------+--------+-------------------------+-----------+ 
| 76 | 15157 | AAAA | 1/1/10     | 844  | 
+-----+-------+--------+-------------------------+-----------+ 
| 77 | 15340 | AAAA | 2015-11-24 15:12:25.057 | 842  | 
+-----+-------+--------+-------------------------+-----------+ 
| 94 | 14644 | GEOFA | 2015-11-13 15:01:19.977 | 842  | 
+-----+-------+--------+-------------------------+-----------+ 
| 94 | 16346 | XX2222 | 2015-11-13 15:01:57.290 | 842  | 
+-----+-------+--------+-------------------------+-----------+ 
| 108 | 15966 | EMPE | 2015-11-25 12:38:37.377 | 842  | 
+-----+-------+--------+-------------------------+-----------+ 

detailTable

+-------+----------+ 
| ID | Name  | 
+-------+----------+ 
| 76 | Dave  | 
+-------+----------+ 
| 15157 | Steven | 
+-------+----------+ 
| 94 | Roger | 
+-------+----------+ 
| 108 | Geoff | 
+-------+----------+ 
| 16346 | Penelope | 
+-------+----------+ 
| 15966 | Paul  | 
+-------+----------+ 
| 77 | Michael | 
+-------+----------+ 
| 14644 | Colin | 
+-------+----------+ 
| 15340 | Nigel | 
+-------+----------+ 

謝謝:)

+0

所有三個ID列都是bigint –

+0

。 。如果所有的id列都是數字的,我不會看到會發生這樣的錯誤。該查詢顯然不符合你的意圖,但這是一個不同的問題。如果你從「74」中刪除單引號,你還會遇到同樣的問題嗎? –

+0

我認爲引號引起了問題,並且加入了錯誤的表格。謝謝! –

回答

1

在正常情況下,不需要left join,因爲鏈接表應該只有有效的引用。選項卡指出,原始查詢中的邏輯不正確。

我唯一的猜測是'74'不是真正的兩位數字 - 隱藏的字符或其他問題。在任何情況下,不需要單引號整型常量,所以你可以嘗試:

SELECT DT1.name as [Name 1], 
     DT2.name as [Name 2] 
     --other columns would go here 
FROM linkTable LT JOIN 
    detailTable DT1 
    ON LT.id1 = DT1.id JOIN 
    detailTable DT2 
    ON LT.id2 = DT2.id 
WHERE DT.id = 74; 

如果不能解決這個問題,我會質疑的說法,所有的ID列bigint。正如所寫,查詢沒有其他地方會發生這種類型轉換。

+0

這是正確的答案 - 報價必須引起問題。另外我在我最初的查詢中加入了錯誤的表格。現在按預期工作 - 謝謝 –

0

你想加入到明細表兩次,而不是鏈接表:

SELECT 
     DT.name as [Name 1], 
     DT2.name as [Name 2] 
     --other columns would go here 

FROM linkTable LT 

LEFT JOIN 
    detailTable DT 
    ON LT.id = DT.id 
LEFT JOIN 
    detailTable DT2 
    ON LT.id2 = DT2.id 
where LT.id = '74' 

如果仍然出現轉換錯誤使用這種格式,它可能在您的示例中未顯示的「其他列」之一中。

+0

這修復了邏輯錯誤。你有解釋爲什麼類型錯誤會發生? OP聲稱所有的id列都是數字。我不明白爲什麼這個版本可以解決這個問題。 –

+0

您是否在編輯之前(代碼塊下方)開始發佈此評論?如果他對所涉及的數據類型是正確的,那麼OP發佈的代碼就不可能發生類型錯誤。 –