2009-10-05 53 views
0

這是受困於我認爲應該工作,但沒有一個例子說明:如何選擇選擇在內部的選擇是返回結果的一個子

select * from TABLE_A where KEY in (
select substr(DYNAMIC_KEY,3) from TABLE_B where DYNAMIC_KEY like '$$%' and RECORD_ID='104251893783388824'); 

基本上,內SELECT語句返回具有'$$'前綴的結果集。這用作TABLE_A中的查找鍵,該鍵在鍵中不包含'$$'前綴。

如果我手動運行內部聲明:

select substr(DYNAMIC_KEY,3) from TABLE_B where DYNAMIC_KEY like '$$%' and RECORD_ID='104251893783388824' 

複製的第一個結果,讓我們說 '8462928318772288542',並運行外部SELECT語句

select * from TABLE_A where KEY = '8462928318772288542' 

這工作。

但是,如果我運行的是select(select ...)語句,我沒有得到任何結果。

編輯

這裏使用的數據庫是Oracle 10g中。

在表-B的DYNAMIC_KEY柱是VARCHAR2

在TABLE_A鍵列是CHAR 32

+0

你使用什麼數據庫? – 2009-10-05 16:33:45

+0

這裏使用的數據庫是Oracle 10g – lsiu 2009-10-05 16:40:12

回答

1

您的問題是TABLE_A.KEY中的數據類型「char(32)」與TABLE_B.DYNAMIC_KEY中的「varchar2」之間的比較結果。 TABLE_A.KEY中的值由dbms填充爲定義大小32的空格。

當您執行子查詢並將結果複製到外部查詢中時,您將char(32)類型的列與文字字符串,dbms像char(32)那樣處理。意思是,它是空白填充,因此比較工作。

在您的原始查詢中,您可以將「where KEY in (」更改爲「where trim(KEY) in (」,那麼查詢應該可以工作。 trim()函數返回一個varchar2值。

+0

謝謝。 Key(char 32列)上的修剪命令也起作用。 – lsiu 2009-10-06 13:26:18

1
SELECT TABLE_A.* 
FROM TABLE_A a 
INNER JOIN TABLE_B b ON a.KEY = b.sbustr(DYNAMIC_KEY,3) 
WHERE b.DYNAMIC_KEY like '$$%' AND b.RECORD_ID='104251893783388824' 
+0

我認爲如果您將TABLE_A別名爲「a」,則需要在選擇列表中使用別名。不知道這是否因數據庫而異 – Gratzy 2009-10-05 16:38:25

+0

嘗試了這一點,並修復了上面的語法錯誤。這也會返回空的結果。 – lsiu 2009-10-05 16:44:46

+0

其實這幫我解決了這個問題。 列類型的差異可能是問題的原因(varchar2 vs char 32)。 爲了解決這個問題,我使用了Joel Coehoorn建議的陳述稍作修改。 替換 a.KEY = SUBSTR(b.DYNAMIC_KEY,3) 與 一個。KEY like concat(substr(DYNAMIC_KEY,3),'%') – lsiu 2009-10-05 16:52:05

0

子串需要3個元素而不是兩個。另外我懷疑key的值和子字符串的值不匹配。

+0

這不是問題,因爲運行內部select語句給出正確的結果,$$前綴已移除。 – lsiu 2009-10-05 16:45:40

+0

其實substr()的第三個參數是可選的 – 2009-10-06 03:06:54

0

你是否可能有拖尾空白,你需要在任一列上修剪掉?或者可能將它們都轉換爲相同的數據類型?