首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Oracle11g重写MySQL SQL

为Oracle11g重写MySQL SQL
EN

Stack Overflow用户
提问于 2015-06-24 07:06:59
回答 1查看 55关注 0票数 1

下面是原始的MySQL语句:

代码语言:javascript
复制
select transactions.username,
       count(transactions.username) as total_transactions,
       last_device,
       last_transaction
  from transactions
 inner join (select username,
                    terminal     as last_device,
                    request_date as last_transaction
               from transactions t1
              where request_date =
                    (select max(request_date)
                       from transactions t2
                      where t1.username = t2.username)) as transactions_per_user
    on transactions_per_user.username = transactions.username
 group by username;

Oracle不喜欢这一说法,因此,经过多次尝试和错误之后,我将其改写为:

代码语言:javascript
复制
 select transactions_per_user.username, 
        count(transactions_per_user.username) as total_transactions, 
        MAX(transactions_per_user.last_transaction) as last_transaction, 
        MAX(transactions_per_user.last_device) as last_device
 from 
 transactions 
 inner join 
 (
    select username, terminal as last_device, request_date as last_transaction 
    from transactions t1 
    where request_date = (select max(request_date) 
    from transactions t2 where t1.username=t2.username)
) 
transactions_per_user on transactions_per_user.username=transactions.username 
group by transactions_per_user.username;

这似乎是正确的事情,但我关心的是使用麦克斯在那里。我不太明白它为什么会起作用。如果不帮我写一条能在oracle中工作的语句来接近mysql,那么谁能验证它是可以的吗?如果sql同时在oracle和mysql中运行,那就更好了。

基本上,我试图生成一个按用户分组的表,其中列出了他们的最后一个事务日期、最后一个使用的设备以及他们所做的事务计数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-24 08:42:13

我使用PL/SQL对相同格式的语句进行格式化,并使用TortuiseSVN dif对它们进行比较。

第一个查询:

代码语言:javascript
复制
SELECT transactions.username,
       COUNT(transactions.username) AS total_transactions,
       last_device,
       last_transaction
  FROM transactions
 INNER JOIN (SELECT username,
                    terminal     AS last_device,
                    request_date AS last_transaction
               FROM transactions t1
              WHERE request_date =
                    (SELECT MAX(request_date)
                       FROM transactions t2
                      WHERE t1.username = t2.username)) AS transactions_per_user
    ON transactions_per_user.username = transactions.username
 GROUP BY username

第二个查询:

代码语言:javascript
复制
SELECT transactions_per_user.username,
       COUNT(transactions_per_user.username) AS total_transactions,
       MAX(transactions_per_user.last_transaction) AS last_transaction,
       MAX(transactions_per_user.last_device) AS last_device
  FROM transactions
 INNER JOIN (SELECT username,
                    terminal     AS last_device,
                    request_date AS last_transaction
               FROM transactions t1
              WHERE request_date =
                    (SELECT MAX(request_date)
                       FROM transactions t2
                      WHERE t1.username = t2.username)) transactions_per_user
    ON transactions_per_user.username = transactions.username
 GROUP BY transactions_per_user.username;

以下是一些变化:

  1. 在第1行和第2行,事务被更改为transactions_per_user --这很好,因为您在transactions_per_user.username = transactions.username上内部连接了这些数据集(但这种更改是不必要的)
  2. last_device,last_transaction与 MAX(transactions_per_user.last_transaction)为last_transaction, MAX(transactions_per_user.last_device) AS last_device 在Oracle中,如果列不在组列表中(即使它们对组中的所有行相等),则不能使用没有分组函数的列。 Oracle在获取数据之前检查查询,因此它不知道将处理哪些数据。(我不确定这在MySQL中是如何工作的) 据我所知,这些列在组内是相等的,所以min和max在这里很好。
  3. 在"AS transactions_per_user“中被删除--这是不必要的(这两种语法都很好)
  4. 将“按用户名分组”改为“transactions_per_user.username组” 如果您使用"ON“子句连接,则需要显式地指定表名或别名,同时如果这些列具有相同的名称,则需要提及它们(否则Oracle不知道您指的是哪一列) 即使您有内部联接,也应该使用显式别名。 如果您使用"USING“子句加入,那么oracle将这2列合并为1,并且不能使用表别名。 您可以选择您喜欢的任何一个语法。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31019922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档