Oracle
如何在另一個查詢中一個一個地使用列的所有選定值?
使用從以下語句返回的列值:
SELECT DISTINCT(column_name) FROM Table1;
進入以下查詢:
SELECT dif_col_1, dif_col_2 FROM Table2 WHERE key_in_table = (SELECT key_in_table FROM Table3 WHERE UPPER(some_column) LIKE '%each_value_from_the_first_query%');
讓我們從內部查詢開始,逐步解決。您想返回
Table3
與 中的任何列匹配的列(使用LIKE
運算符)的行Table1
,對嗎?我會為此使用EXISTS運算符。我們可以將您的問題改寫為“從table3
其中返回至少存在一個匹配行的所有行Table1
”。這是一個實現:SELECT key_in_table FROM Table3 WHERE EXISTS ( SELECT 1 FROM Table1 WHERE UPPER(Table3.some_column) LIKE '%' || Table1.column_name || '%' );
您可以單獨執行該查詢,這樣您就可以對它返回您所追求的結果感到滿意。最終查詢就像將該子查詢集成到您已有的查詢中一樣簡單:
SELECT dif_col_1, dif_col_2 FROM Table2 WHERE key_in_table = ( SELECT key_in_table FROM Table3 WHERE EXISTS ( SELECT 1 FROM Table1 WHERE UPPER(Table3.some_column) LIKE '%' || Table1.column_name || '%' ) );
您可以將您的第一個查詢用作派生表,並將其連接到
Table3
使用LIKE
連接條件中的謂詞:SELECT dif_col_1, dif_col_2 FROM Table2 WHERE key_in_table IN ( SELECT Table3.key_in_table FROM Table3 **INNER JOIN (SELECT DISTINCT column_name AS column_name from Table1) t1 ON UPPER(Table3.some_column) LIKE '%' || t1.column_name || t1.'%'** ) ;
注意
key_in_table = ...
to的變化key_in_table IN ...
。由於子查詢與一組值匹配,它可以生成自己的一組(多行)。將單個值與一組兩個或多個值進行比較會在 Oracle 中產生錯誤,因此使用不同的謂詞 (IN
)。