2013-06-01 33 views
-1

比方說,我有2個表(實際上有更多的這個命令,但只有那些影響問題)。非常複雜的TSQL與內部聯接同一個表兩次

表A具有唯一帳戶,表C具有唯一材料。

現在讓我們說ID 11的唯一帳戶可以有幾個獨特的材料(例如:10,18,19,24)。材料可以是相同類型或不同的(例如:10-型2,18-型2,19型1,24型3)並且它們具有它們的編號(例如:10- A24,18- A25,19-32, A24,24 - B55)和其他許多值(但是例如1就足夠了)。

每個材料的專用列中都有帳戶ID。

現在我需要根據所輸入的字符串的標準來選擇一些值到數據表:

String1 = Afst; //some value from tableA 
//... 
String2 = Ctype; // SomeType of Material from table C 
String3 = dn; // number of Material from table C 

Afst(TABLEA)| ... | dn(C類型的tableC數)| dn2(Type2的表C號)

其中dn2指定了類型。

這裏的問題是我需要使用Ctype選擇所有材料,即使Type2對於此帳戶不存在。

例如,這將使所有結果當兩個CTYPE和type2中存在:

("SELECT a.id, a.Afst, c.dn, d.dn as 'dn2' FROM sometableA a INNER JOIN sometableC c ON a.id=c.idofa INNER JOIN sometableC d ON a.id=d.idofa WHERE a.Afst like '%" + String1 + "%' and c.MaterialType='" + String2 + "' and c.dn like '%" + String3 + "%' and d.MaterialType='2'"); 

注意:我不能以任何方式更改數據庫表,所以我不能材質表分成表類型。

這也應該在單個TSQL命令中。

+0

做相關子查詢或反對對同一個表計數選擇加入「單一TSQL命令」(實際上這就是所謂的查詢)?他們在性能方面很昂貴,但這聽起來像是他們很好解決的問題。 (鑑於你已經在使用'LIKE'和通配符以及動態SQL,它似乎並不是你的需求中的最高性能。) –

+0

根據你的文章,我不太清楚你需要什麼,但它看起來像你想返回不匹配的行嗎?在這種情況下,看看左/右加入,而不是INNER 也是你發佈的示例查詢並不真正對應於你的詳細解釋,如果你可以發佈模式,這將有助於 –

+0

在這個問題上付出一些努力。即使進行編輯也很難遵循。把實際的字符串放在查詢中。 – Paparazzi

回答

1

我不是舒爾已經瞭解正確的,也許是第一個加入必須是inner

SELECT a.id, a.Afst, c.dn, d.dn as 'dn2' 
    FROM sometableA a 
    LEFT JOIN sometableC c ON a.id=c.idofa and c.MaterialType = 'String2' and c.dn like '%String3%' 
    LEFT JOIN sometableC d ON a.id=d.idofa and d.MaterialType= '2' 
    WHERE a.Afst like '%String1%' 
+0

謝謝。對於我的情況,在您的聲明中,第一次左連接應該是INNER,並且只有第二個LEFT如您所預測的那樣:D – Alt