【问题标题】:oracle query with several filter conditions具有多个过滤条件的 oracle 查询
【发布时间】:2012-05-08 02:51:33
【问题描述】:

我有一个 oracle 查询:

select * from table1,table2 where table1.id1 = table2.id2 and 
--filters
table1.col2 = 'value_11' and table2.col2 = 'value_21'
or
table1.col2 = 'value_12' and table2.col2 = 'value_22'
or
table1.col2 = 'value_13' and table2.col2 = 'value_23'
...

如果过滤条件达到 100,如何重写查询?喜欢(value_11,value_21),(value_12,value_22)......(value_1100,value_2200)

编辑:原始查询是这样的:

select 
    cust_country.cust_login_id 
  , cust_country.user_login_id
  , cust_country.country_name
  , cust_email.email 
from ( select 
           APP_USER.USER_ID, customer.cust_login_id
         , user_credential.user_login_id, COUNTRY.COUNTRY_NAME 
       from 
           app_user
         , user_ci
         , contact_info
         , address
         , country
         , customer
         , user_credential 
       where APP_USER.USER_ID = USER_CI.USER_ID 
         and CONTACT_INFO.CI_ID=USER_CI.CI_ID
         and ADDRESS.ADDR_ID=CONTACT_INFO.CI_ID 
         and ADDRESS.COUNTRY_ID=COUNTRY.COUNTRY_ID 
         and APP_USER.CUST_ID=CUSTOMER.CUST_ID 
         and USER_CREDENTIAL.USER_ID=APP_USER.USER_ID
     ) cust_country,

     ( select 
           customer.cust_login_id, APP_USER.USER_ID
         , user_credential.user_login_id, ipty_email.email
       from 
         app_user,user_ci,contact_info,ipty_email,customer,user_credential 
       where APP_USER.USER_ID = USER_CI.USER_ID 
         and CONTACT_INFO.CI_ID=USER_CI.CI_ID 
         and ipty_email.ipe_ID=CONTACT_INFO.CI_ID 
         and APP_USER.CUST_ID=CUSTOMER.CUST_ID 
         and USER_CREDENTIAL.USER_ID=APP_USER.USER_ID
     ) cust_email

where cust_country.user_id = cust_email.user_id 
  and (cust_country.cust_login_id, cust_country.user_login_id) in 
      (('xxxxyyyyy','ADMIN2'))

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    你可以(稍微)压缩一下:

    SELECT *                                       --- irrelevant to the question:
    FROM table1 JOIN table2                        --- use the explicit JOIN syntax
                 ON table1.id1 = table2.id2        --- not the implicit join with the
    ---table1,table2 where table1.id1 = table2.id2 --- WHERE syntax (removed)
    WHERE
    --- filters
      AND (table1.col2, table2.col2) IN
            (  ('value_11', 'value_21'),
               ('value_12', 'value_22'),
               ('value_13', 'value_23'),
               ...
               (value_1100, value_2200)
            ) 
    

    如果表格中有这些过滤条件,你甚至可以做到:

      AND (table1.col2, table2.col2) IN
            (  SELECT filter1, filter2
               FROM filter_table
            )
    

    【讨论】:

    • 谢谢。当我尝试它时,我在这一行得到“无效的关系运算符”:(('value_11','value_21'),
    • @Kaushik:您使用哪个版本或 Oracle?
    • 它应该可以工作:Oracle 10g, IN syntax。您可能放错了逗号或括号。你能提供你使用的确切查询吗?
    • 谢谢。你能在我的 EDIT 中看到只有一组过滤器值的查询吗?
    • 只有一个过滤器,你应该使用:in (('xxxxyyyyy','ADMIN2'))
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多