在Oracle中,如何根据特定条件从一个表或另一个表中选择?

rqdpfwrv  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(274)

我有一个查询,如果满足某个条件,则必须从一个表中选择;如果条件不同,则必须从另一个表中选择。
在我的例子中,如果我们在Database_A上,我需要从Table_A中选择,如果我们在Database_B上,我需要从Table_B中选择,但是条件可以是不同的。
我想做这样的事情:

SELECT
    COLUMN_1, COLUMN_2, ..., COLUMN_N
FROM
    (if database is Database_A then Table_A
     but if database is Database_B then from Table B
     else... it could be DUAL if any other situation, it will throw an error, but i can manage it)
WHERE
    (my where criteria)

我怎么能用纯SQL而不是PL-SQL呢?我可以使用嵌套查询或WITH或类似的东西,但不能“编码”。我不能创建表或视图,我只能查询数据库的数据。
我试过使用CASE或其他选项,但没有运气。

e0bqpujr

e0bqpujr1#

您可以在条件准则中使用数据库名称和UNION运算子,从右边的表格中选取。

SELECT COLUMN_1, COLUMN_2, ..., COLUMN_N
    FROM
    (
     SELECT COLUMN_1, COLUMN_2, ..., COLUMN_N
     FROM TableA
     WHERE ora_database_name = 'DatabaseA'
     UNION ALL
     SELECT COLUMN_1, COLUMN_2, ..., COLUMN_N
     FROM TableB
     WHERE ora_database_name = 'DatabaseB'
     UNION ALL
     SELECT 'ERROR', null, ..., null
     FROM DUAL
     WHERE ora_database_name NOT IN ('DatabaseA', 'DatabaseB')
     )
     WHERE
     (my where criteria)
lrpiutwd

lrpiutwd2#

如果是从两个表中选择一个表的情况,则类似下面的内容可能会有所帮助:

WITH
    tab_a AS
        (   Select COL_1, COL_2, COL_3 From TABLE_A  ),   -- It is possible to do the filter here or in the main SQL or both
    tab_b AS
        (   Select COL_1, COL_2, COL_3 From TABLE_B  )    -- It is possible to do the filter here or in the main SQL or both

Select DISTINCT
    CASE WHEN 1 = 1 THEN a.COL_1 ELSE b.COL_1 END "COL_1",
    CASE WHEN 1 = 1 THEN a.COL_2 ELSE b.COL_2 END "COL_2",
    CASE WHEN 1 = 1 THEN a.COL_3 ELSE b.COL_3 END "COL_3"
From
    tab_a a
Inner Join
    tab_b b ON(1 = 1)
Where
    CASE WHEN 1 = 1 THEN b.COL_1 ELSE a.COL_2 END = 'XXX'   -- filter could be set on the same columns or on different ones of the same type

您可以将where子句放在cte定义(WITH子句)或主SQL中,或者同时放在这两个语句中。

  • CASE表达式中的WHEN条件应根据数据上下文放置,这是从一个或另一个表中选择/筛选数据的位置。
  • INNER JOIN ON条件可以保持原样(1=1),因为它会创建将由DISTINCT关键字解决的交叉链接。

如果两个表都不能从两个数据库访问,那么你应该有一个单独的脚本,每个数据库一个脚本。但是,你可以检查哪个是活动的数据库和/或是否有一个特定的表。

-- to get the db name ...
Select NAME "DB_NAME" From V$database

-- ... to check if the table exist ...
Select TABLE_NAME from ALL_TABLES where TABLE_NAME = 'TABLE_A'

-- ... or some additional info besides the table name
Select
    u.USER_ID, u.USERNAME,
    t.TABLE_NAME, t.OWNER "TABLE_OWNER"
From ALL_USERS u
Inner Join ALL_TABLES t ON(t.OWNER = u.USERNAME)
Where TABLE_NAME = 'TABLE_A'

相关问题