【问题标题】:Converting SQL Server Query to Oracle Query将 SQL Server 查询转换为 Oracle 查询
【发布时间】:2016-07-29 09:02:31
【问题描述】:

我有 SQL Server 数据库查询:-

          SELECT DISTINCT
                 info.COLUMN_NAME AS NAME,
                 info.TABLE_SCHEMA AS TABLESCHEMA,
                 info.TABLE_NAME AS TABLENAME,
                 info.ORDINAL_POSITION AS POSITION, 
                 info.IS_NULLABLE AS ISNULLABLE,
                 info.DATA_TYPE AS DATATYPE,
                 tc.CONSTRAINT_TYPE AS CONSTRAINTTYPE,
                 kcufk.TABLE_SCHEMA AS REFRENCESCHEMA, 
                 kcufk.TABLE_NAME AS REFRENCETABLE,
                 kcufk.COLUMN_NAME AS REFRENCECOLUMN
            FROM INFORMATION_SCHEMA.COLUMNS info
 LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu 
              ON kcu.COLUMN_NAME = info.COLUMN_NAME
             AND kcu.TABLE_NAME = info.TABLE_NAME
 LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
              ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
             AND tc.TABLE_NAME = kcu.TABLE_NAME
 LEFT OUTER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rk 
              ON rk.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
 LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcufk 
              ON kcufk.CONSTRAINT_NAME = rk.UNIQUE_CONSTRAINT_NAME
           WHERE info.TABLE_NAME = 'Category'
             AND info.TABLE_SCHEMA = 'core' 
        ORDER BY info.ORDINAL_POSITION ASC;

如何将此 SQL Server 查询转换为 Oracle 查询?

【问题讨论】:

  • 你试过了吗?你有什么问题?
  • @Aleksej:- 是的,我试过了。问题是行多次出现。
  • 它们是否在 SQL Server 中多次出现?你的数据一样吗?
  • @Matt No in Sql Server 完美实现.. 我只在 oracle 数据库中面临的问题 & 两个数据库中的数据相同..
  • 你有很多空值吗?

标签: oracle oracle11g oracle-sqldeveloper oracle-xe


【解决方案1】:
SELECT tc.column_name,
       tc.owner,
       tc.table_name,
       tc.column_id,
       tc.nullable,
       tc.data_type,
       c.constraint_type,
       c.r_owner AS reference_owner,
       rcc.table_name AS reference_table,
       rcc.column_name AS reference_column_name
FROM   ALL_TAB_COLUMNS tc
       LEFT OUTER JOIN ALL_CONS_COLUMNS cc
       ON ( tc.owner = cc.owner AND tc.table_name = cc.table_name AND tc.column_name = cc.COLUMN_NAME )
       LEFT OUTER JOIN ALL_CONSTRAINTS c
       ON ( tc.owner = c.owner AND tc.table_name = c.table_name AND c.constraint_name = cc.constraint_name )
       LEFT OUTER JOIN ALL_CONS_COLUMNS rcc
       ON ( c.r_owner = rcc.owner AND c.r_constraint_name = rcc.constraint_name )
WHERE  tc.table_name = 'CATEGORY'
AND    tc.OWNER      = 'CORE'
ORDER BY tc.column_id;

【讨论】:

    【解决方案2】:

    尝试使用“INNER JOIN”。

    SELECT DISTINCT
    info.COLUMN_NAME AS NAME,
    info.TABLE_SCHEMA AS TABLESCHEMA,
    info.TABLE_NAME AS TABLENAME,
    info.ORDINAL_POSITION AS POSITION, 
    info.IS_NULLABLE AS ISNULLABLE,
    info.DATA_TYPE AS DATATYPE,
    tc.CONSTRAINT_TYPE AS CONSTRAINTTYPE,
    kcufk.TABLE_SCHEMA AS REFRENCESCHEMA, 
    kcufk.TABLE_NAME AS REFRENCETABLE,
    kcufk.COLUMN_NAME AS REFRENCECOLUMN
    FROM INFORMATION_SCHEMA.COLUMNS info
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON kcu.COLUMN_NAME = info.COLUMN_NAME AND kcu.TABLE_NAME = info.TABLE_NAME
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME AND tc.TABLE_NAME = kcu.TABLE_NAME
    INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rk ON rk.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcufk ON kcufk.CONSTRAINT_NAME = rk.UNIQUE_CONSTRAINT_NAME
    WHERE info.TABLE_NAME ='Category'
    AND info.TABLE_SCHEMA ='core' 
    ORDER BY info.ORDINAL_POSITION ASC;
    

    或者如果使用LEFT OUTER JOIN,则在链接值上使用IS NOT NULL

    SELECT DISTINCT
    info.COLUMN_NAME AS NAME,
    info.TABLE_SCHEMA AS TABLESCHEMA,
    info.TABLE_NAME AS TABLENAME,
    info.ORDINAL_POSITION AS POSITION, 
    info.IS_NULLABLE AS ISNULLABLE,
    info.DATA_TYPE AS DATATYPE,
    tc.CONSTRAINT_TYPE AS CONSTRAINTTYPE,
    kcufk.TABLE_SCHEMA AS REFRENCESCHEMA, 
    kcufk.TABLE_NAME AS REFRENCETABLE,
    kcufk.COLUMN_NAME AS REFRENCECOLUMN
    FROM INFORMATION_SCHEMA.COLUMNS info
    LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON kcu.COLUMN_NAME = info.COLUMN_NAME AND kcu.TABLE_NAME = info.TABLE_NAME
    LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME AND tc.TABLE_NAME = kcu.TABLE_NAME
    LEFT OUTER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rk ON rk.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
    LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcufk ON kcufk.CONSTRAINT_NAME = rk.UNIQUE_CONSTRAINT_NAME
    WHERE info.TABLE_NAME ='Category'
    AND info.TABLE_SCHEMA ='core'
    AND info.COLUMN_NAME IS NOT NULL
    AND info.TABLE_NAME IS NOT NULL
    AND kcu.CONSTRAINT_NAME IS NOT NULL
    AND kcu.TABLE_NAME IS NOT NULL
    AND rk.UNIQUE_CONSTRAINT_NAME IS NOT NULL
    ORDER BY info.ORDINAL_POSITION ASC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      相关资源
      最近更新 更多