在 Access 中工作但在 SQL Oracle Developer 中不工作

Works in Access but does not work in SQL Oracle Developer

此查询正在提取文档名称列中所有拥有无线电或荧光许可证的医生

select practitioner_id_numbers.pract_id
      , practitioner_id_numbers.id_number
      , practitioner_id_numbers.expiration_date
      , practitioner_id_numbers.documentname
      , practitioner_id_numbers.historical 
from practitioner_id_numbers 
group by practitioner_id_numbers.pract_id
          , practitioner_id_numbers.id_number
          , practitioner_id_numbers.expiration_date
          , practitioner_id_numbers.documentname
          , practitioner_id_numbers.historical 
 having (((practitioner_id_numbers.documentname) like "Radio*" 
        or (practitioner_id_numbers.documentname) like "Fluoro*") 
        and ((practitioner_id_numbers.historical)=0));

Microsoft Access 创建自己的 SQL 版本,这真的很烦人,因为它实际上将正确的 SQL 呈现给 DBMS 本身——它只是不将其公开给最终用户.如果要使此 DBMS 兼容,则需要考虑到 Access 为 table 创建了别名并将 schema/table 分隔符从点变为下划线。

因此,根据您的 table 名称是 practitioner.id_numbers 还是 practitioner_id.numbers,SQL 会有所不同——假设是后者,Oracle SQL 将是:

select practitioner_id.numbers.pract_id
      , practitioner_id.numbers.id_number
      , practitioner_id.numbers.expiration_date
      , practitioner_id.numbers.documentname
      , practitioner_id.numbers.historical 
from practitioner_id.numbers 
group by practitioner_id.numbers.pract_id
          , practitioner_id.numbers.id_number
          , practitioner_id.numbers.expiration_date
          , practitioner_id.numbers.documentname
          , practitioner_id.numbers.historical 
 having (((practitioner_id.numbers.documentname) like 'Radio%'
        or (practitioner_id.numbers.documentname) like 'Fluoro%') 
        and ((practitioner_id.numbers.historical)=0));

另请注意,在 Access 中,对于值,双引号变为单引号,星号变为百分号。

要使这个 SQL 在 Access 中工作,您可以 运行 它作为直通查询,然后您的代码将从那时起成为 portable。唯一的缺点是,如果您进行直通,则无法再在 Access 中使用设计器。

也就是说,Access 的另一个危险是它倾向于过度使用 havingwhere 是首选。假设条件消除了大量行,以下代码在 Oracle 端会更有效:

select practitioner_id.numbers.pract_id
      , practitioner_id.numbers.id_number
      , practitioner_id.numbers.expiration_date
      , practitioner_id.numbers.documentname
      , practitioner_id.numbers.historical 
from practitioner_id.numbers 
where (((practitioner_id.numbers.documentname) like 'Radio%' 
        or (practitioner_id.numbers.documentname) like 'Fluoro%') 
        and ((practitioner_id.numbers.historical)=0))
group by practitioner_id.numbers.pract_id
          , practitioner_id.numbers.id_number
          , practitioner_id.numbers.expiration_date
          , practitioner_id.numbers.documentname
          , practitioner_id.numbers.historical 

并且,只是为了笑,如果你想让它更地道一点,你可以添加别名并将 group by 更改为 distinct(因为你似乎实际上没有使用分组函数):

select distinct
  pi.pract_id
 , pi.id_number
 , pi.expiration_date
 , pi.documentname
 , pi.historical 
from practitioner_id.numbers as pi
where
  ((pi.documentname like 'Radio%' or
    pi.documentname like 'Fluoro%') and
    pi.historical=0)