Oracle

如何在另一個查詢中一個一個地使用列的所有選定值?

  • January 19, 2017

使用從以下語句返回的列值:

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)。

引用自:https://dba.stackexchange.com/questions/161458