2013-11-27 102 views
1

我在查詢中有4個表。 表A 表B 表C 表D.TSQL執行點

表d包含查找有關表B. 值我已經結構化查詢如下:

Select a.Col1, a.Col2, b.Col1, b.Col2, c.Col1 
from [Table A] a 
inner join [Table C] c 
    on c.key1= a.key1 
    and c.key2 = 'static value' 
inner join [Table B] b 
    on b.key1 = a.key1 
    and b.key2 = 'static value' 
    **and b.key3 in (select d.key1 
        from [Table D] d)** 
    and substring(b.key4, len(b.key4), 1) in ('static value 1', 'static value 2') 
    and substring(b.key4, 1, len(b.key4)-1) in c.key1 

所以出現在我的問題加入[表B]。具體來說,將b.key3加入值列表。由於我得到了無效的結果,因此在執行連接之後SQL似乎執行了表D的查詢。現在,如果我提供'在'具體值的表D的查詢將返回。它運行沒有問題,併產生有效的結果。

有人可以澄清這個查詢的執行是如何工作的,因爲它涉及到總查詢,如果遇到這個問題,還可能有一個解決方法嗎?

感謝

回答

0

看來,如果你只是想檢查b.key3在[表d],您可以解決此通過使用內部連接到餐桌d,如果有一到存在此表與其他人之間的多種關係然後使用一組。

Select a.Col1, a.Col2, b.Col1, b.Col2, c.Col1 
    from [Table A] a 
    inner join [Table C] c 
     on c.key1= a.key1 
    inner join [Table B] b 
     on b.key1 = a.key1 
    inner join [Table D] d 
     ON b.key3 = d.key1 
    where c.key2 = 'static value' 
     and b.key2 = 'static value' 
     and right(b.key4,1) in ('static value 1', 'static value 2') 
     and substring(b.key4, 1, len(b.key4)-1) = c.key1 
    group by a.Col1, a.Col2, b.Col1, b.Col2, c.Col1 

我也動了你的靜態變量檢查WHERE子句和刪除SUBSTRING功能還可以完成你想要使用什麼是正確的功能。

希望這會有所幫助。

+0

我看到你在那裏做了什麼,這是有道理的。但是,我試圖實現這一點,並遇到了同樣的問題。發生什麼事情是當這行執行時,我得到文本的轉換錯誤爲int。和c.key1中的子字符串(b.key4,1,len(b.key4)-1)。 c.key1是所有整數。當子字符串執行時,b.key4應該是整數。表D中的值的查詢/連接應該消除那些將這些值渾濁起來的值。有效值是214y,113q,667y。但由於某種原因,與表B的連接不會過濾掉無效值。感謝您迄今的努力。 – user1186256

+0

嗨,我不完全確定我理解你遇到的問題,我會在比較不同的數據類型時檢查你是否正在轉換你的值,也可以先在CTE中執行子字符串並消除任何不是INT的值。 – Suroh