【问题标题】:oracle sql select script helporacle sql 选择脚本帮助
【发布时间】:2010-09-20 12:17:11
【问题描述】:

有人可以帮忙选择脚本吗?

想要的结果

 TABLENAME, ATTRIBUTE, NULLABLE, DATATYPE, LENGTH, DESC, HELP_TEXT having count(datadic.ATTRIBUTE)>1  (because these can only be unique) 

并且对于具有相同值的任何其他属性(不包括 DDKEY 和 SerNo)不是唯一的。

 TABLE2 ADDR4 NULL VARCHAR2 15 Unit Address Line 4 Unit address line 4 
 TABLE1 ADDR4 NULL VARCHAR2 30 Unit Address Line 4 Unit address line 4 

我正在努力解决嵌套查询

现实生活中我想看看我的数据库在不同的表中是否有任何具有不同值的属性,这是一种管家练习。

我有 154 个表 700 个属性

到目前为止

 select attribute,count(DATADIC.ATTRIBUTE) as "ATTRIBUTE" 
 from "DATADIC" "DATADIC"
 group by DATADIC.ATTRIBUTE 
 having count(datadic.ATTRIBUTE)>1)
 order by count(DATADIC.ATTRIBUTE)

然后

 select TABLENAME,ATTRIBUTE,NULLABLE, DATATYPE, LENGTH, DESC, HELP_TEXT 
 from datadic 
 where      
 attribute in
 (select attribute,count(DATADIC.ATTRIBUTE) as "ATTRIBUTE" 
   from "DATADIC" "DATADIC"
   group by DATADIC.ATTRIBUTE
   having count(datadic.ATTRIBUTE)>1)
   order by count(DATADIC.ATTRIBUTE)

值太多

 desc
 DATADIC.
  DDKEY Number 
  SER Number 
  TABLENAME Varchar2 15 
  ATTRIBUTE Varchar2 25
  NULLABLE Varchar2 10 
  DATATYPE Varchar2 15  
  LENGTH number(7,3) 
  DESCRIPTION Varchar2 30
  HELP_TEXT Varchar2 1000

样本数据

556 5 TABLE2 ADDR1 NULL VARCHAR2 30 Unit Address Line 1 Unit address line 1 
545 5 TABLE1 ADDR1 NULL VARCHAR2 30 Unit Address Line 1 Unit address line 1 
546 6 TABLE1 ADDR2 NULL VARCHAR2 30 Unit Address Line 2 Unit address line 2 
557 6 TABLE2 ADDR2 NULL VARCHAR2 30 Unit Address Line 2 Unit address line 2 
547 7 TABLE1 ADDR3 NULL VARCHAR2 30 Unit Address Line 3 Unit address line 3 
558 7 TABLE2 ADDR3 NULL VARCHAR2 30 Unit Address Line 3 Unit address line 3 
559 8 TABLE2 ADDR4 NULL VARCHAR2 15 Unit Address Line 4 Unit address line 4 
548 8 TABLE1 ADDR4 NULL VARCHAR2 30 Unit Address Line 4 Unit address line 4 

有用的脚本

CREATE TABLE  "DATADIC" 
(   "DDKEY" NUMBER, 
"SER" NUMBER, 
"TABLENAME" VARCHAR2(15), 
"ATTRIBUTE" VARCHAR2(25), 
"NULLABLE" VARCHAR2(10), 
"DATATYPE" VARCHAR2(15), 
"LENGTH" NUMBER(7,3), 
"DESCRIPTION" VARCHAR2(30), 
"HELP_TEXT" VARCHAR2(1000), 
 CONSTRAINT "DATADIC_PK" PRIMARY KEY ("DDKEY") ENABLE
)

/

CREATE OR REPLACE TRIGGER  "bi_DATADIC" 
before insert on "DATADIC"              
for each row 
begin  
  for c1 in ( 
   select "DATADIC_SEQ".nextval next_val 
    from dual 
  ) loop 
  :new."DDKEY" :=  c1.next_val; 
 end loop; 
end;

/
ALTER TRIGGER  "bi_DATADIC" ENABLE
/

数据 csv

 556,5,TABLE2,ADDR1,NULL,VARCHAR2,30,Unit Address Line 1,Unit address line 1
 557,6,TABLE2,ADDR2,NULL,VARCHAR2,30,Unit Address Line 2,Unit address line 2
 558,7,TABLE2,ADDR3,NULL,VARCHAR2,30,Unit Address Line 3,Unit address line 3
 559,8,TABLE2,ADDR4,NULL,VARCHAR2,15,Unit Address Line 4,Unit address line 4
 545,5,TABLE1,ADDR1,NULL,VARCHAR2,30,Unit Address Line 1,Unit address line 1
 546,6,TABLE1,ADDR2,NULL,VARCHAR2,30,Unit Address Line 2,Unit address line 2
 547,7,TABLE1,ADDR3,NULL,VARCHAR2,30,Unit Address Line 3,Unit address line 3
 548,8,TABLE1,ADDR4,NULL,VARCHAR2,30,Unit Address Line 4,Unit address line 4

更新的数据现在正在使用此查询,但我不需要使不唯一

select * from ( select TABLENAME, ATTRIBUTE, NULLABLE,
DATATYPE,
LENGTH,
DESCRIPTION,
HELP_TEXT, count(*) over (partition by attribute) attr_count
from datadic ) where attr_count > 1

TABLENAME ATTRIBUTE NULLABLE DATATYPE LENGTH 描述 HELP_TEXT ATTR_COUNT TABLE2 ADDR1 NULL VARCHAR2 30 单元地址行 1 单元地址行 1 2 TABLE1 ADDR1 NULL VARCHAR2 30 单元地址行 1 单元地址行 1 2 TABLE1 ADDR2 NULL VARCHAR2 30 单元地址行 2 单元地址行 2 2 TABLE2 ADDR2 NULL VARCHAR2 30 单元地址行 2 单元地址行 2 2 TABLE1 ADDR3 NULL VARCHAR2 30 单元地址行 3 单元地址行 3 2 TABLE2 ADDR3 NULL VARCHAR2 30 单元地址线 3 单元地址线 3 2 TABLE2 ADDR4 NULL VARCHAR2 30 单元地址行 4 单元地址行 4 2 TABLE1 ADDR4 NULL VARCHAR2 30 单元地址行 4 单元地址行 4 2

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    选择 TABLENAME、ATTRIBUTE、NULLABLE、 DATATYPE、LENGTH、DESC、HELP_TEXT 来自 datadic where 属性在(选择 属性,计数(DATADIC.ATTRIBUTE)为 来自“DATADIC”“DATADIC”的“属性” 按 DATADIC.ATTRIBUTE 分组 count(datadic.ATTRIBUTE)>1) 排序 计数(DATADIC.ATTRIBUTE)

    您获得的值过多,因为查询在“IN”子句之后需要一列。尝试以下查询以获取表中具有多次出现的属性的所有行。

    select TABLENAME,
           ATTRIBUTE,
           NULLABLE, 
           DATATYPE, 
           LENGTH, 
           DESC, 
           HELP_TEXT 
      from datadic 
      where attribute in 
      (
      select attribute from (
      select attribute,
             count(DATADIC.ATTRIBUTE) as "ATTRIBUTE" 
       from "DATADIC" "DATADIC" 
       group by DATADIC.ATTRIBUTE 
       having count(datadic.ATTRIBUTE)>1) 
       order by count(DATADIC.ATTRIBUTE)
       )
      )
    

    您可以充分利用分析函数以更简单的方式回答此查询。

    select * from (
    select TABLENAME,
           ATTRIBUTE,
           NULLABLE, 
           DATATYPE, 
           LENGTH, 
           DESC, 
           HELP_TEXT,
           count(*) over (partition by attribute) attr_count 
      from datadic
    ) where attr_count > 1
    

    【讨论】:

    • select * from (select TABLENAME, ATTRIBUTE, NULLABLE, DATATYPE, LENGTH, DESCRIPTION, HELP_TEXT, count(*) over (partition by attribute) attr_count from datadic ) where attr_count > 1
    • 修改属性 desc ,这给了我现在可以处理的列表,并且对于具有相同值的任何其他属性(不包括 DDKEY 和 SerNo)来说不是唯一的。
    • 在多个属性中使用不唯一的可能吗?
    • 不太确定我是否在这里得到了您的问题。我假设您之前提供的数据 CSV 是输入。您还可以提供预期的输出吗?这会清理很多事情。
    • TABLE2 ADDR4 NULL VARCHAR2 15 Unit Address Line 4 Unit address line 4 TABLE1 ADDR4 NULL VARCHAR2 30 Unit Address Line 4 Unit address line 4 预期输出,因为属性匹配但其余值不小于DDKEY 和 SerNo
    猜你喜欢
    • 2010-12-11
    • 2021-04-02
    • 2011-07-28
    • 2011-04-04
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多