标签: query-refactor

避免多个 `or` 表达式

我有以下 oracle SQL 及其作品,但所有ors都很丑陋。有没有更简洁的方法来做到这一点?

SELECT * FROM foobar WHERE
  (SUBJECT ='STAT' and TERM ='111') or  
  (SUBJECT ='STAT' and TERM ='222') or  
  (SUBJECT ='ENGLISH' and TERM ='555') or 
  (SUBJECT ='COMM' and TERM ='444') or
  (SUBJECT ='COMM' and TERM ='333') or  
  (SUBJECT ='STAT' and TERM ='666')
  ...
Run Code Online (Sandbox Code Playgroud)

oracle query-refactor

13
推荐指数
2
解决办法
2484
查看次数

这两个查询在逻辑上是等价的吗?

这两个查询在逻辑上是等价的吗?

DECLARE @DateTime DATETIME = GETDATE()
Run Code Online (Sandbox Code Playgroud)

查询 1

SELECT *
FROM   MyTable
WHERE  Datediff(DAY, LogInsertTime, @DateTime) > 7   
Run Code Online (Sandbox Code Playgroud)

查询 2

SELECT *
FROM   MyTable
WHERE  LogInsertTime < @DateTime - 7 
Run Code Online (Sandbox Code Playgroud)

如果它们在逻辑上不是等价的,您能否给我第一个查询的逻辑等价,以便 WHERE 子句可以有效地使用索引(即消除函数包装)?

performance sql-server query query-refactor query-performance

10
推荐指数
3
解决办法
699
查看次数

有没有办法通过重复 TableB 将 TableA 的每一行连接到较小的 TableB 的一行,但需要多次?

抱歉,标题令人困惑,我不知道在那里写什么。

我有一张包含几百条记录的表格。我需要将这个表的每条记录分配给一个更小的动态用户表,并且用户应该交替分配他们被分配的记录。

例如,如果表A是

Row_Number() 标识
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10

表B是

Row_Number() 标识
1 1
2 2
3 3

我需要一个最终结果集

用户 ID 记录 ID
1 1
2 2
3 3
1 4
2 5
3 6
1 7
2 8
3 9
1 10

我已经设法使用 mod 运算符做了一些有点混乱的事情,但是我很好奇是否可以在没有临时表和变量的情况下运行相同的查询。

使用临时表是因为 TableA 实际上是一个用户定义的函数,它将逗号分隔的字符串转换为表,我需要来自 UDF 的对象的计数。

-- Converts a comma-delimited string into a table
SELECT Num as [UserId], Row_Number() …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 query-refactor

8
推荐指数
2
解决办法
481
查看次数

是否有更简洁的方法将 UTC 日期时间仅转换为本地日期?

我正在尝试编写一个查询,该查询仅根据 UTC 日期时间字段的本地日期部分对记录进行分组。

例如,如果我的表包含10/19/2012 2:00:00,那么它应该被分组为10/18/2012,因为我的本地时间是美国东部时间 (-5h) 并且我只对字段的日期部分感兴趣。

我知道我DateAdd(day, DateDiff(day, 0, MyDate), 0)只能从日期时间字段中获取日期部分,我可以DateAdd(minute, DateDiff(minute, GetUtcDate(), GetDate()), MyUtcDate)用来将 UTC 日期时间转换为本地日期时间。

但是将两者结合起来严重冒犯了我。

在 SQL Server 2005 中,是否有比这更好的方法来获取 UTC 日期时间字段的日期部分,转换为本地时间?

  SELECT DateAdd(day, DateDiff(day, 0, DateAdd(minute, DateDiff(minute, GetUtcDate(), GetDate()), MyUtcDate)), 0)
       , Count(*)
    FROM MyTable
GROUP BY DateAdd(day, DateDiff(day, 0, DateAdd(minute, DateDiff(minute, GetUtcDate(), GetDate()), MyUtcDate)), 0)
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server query-refactor

7
推荐指数
1
解决办法
2万
查看次数

获取 MySQL 中按列分组的最新行

我的问题似乎应该有一个比我想出的更简单的解决方案。从这个数据集开始:

日志表

+--------+-----------+------------------+---------+
| log_id | entity_id |       date       | comment |
+--------+-----------+------------------+---------+
|      1 | A         | 2012-10-23 07:50 | foo     |
|      2 | B         | 2012-10-23 07:59 | bar     |
|      3 | B         | 2012-10-23 08:11 | baz     |
|      4 | A         | 2012-10-23 08:23 | bat     |
+--------+-----------+------------------+---------+
Run Code Online (Sandbox Code Playgroud)

假设我想获取每个实体的日志条目的最新日期,以便结果如下所示:

Results:
+-----------+------------------+--------------+
| entity_id |  last_log_date   | last_comment |
+-----------+------------------+--------------+
| B         | 2012-10-23 08:11 | baz          |
| A         | 2012-10-23 08:23 …
Run Code Online (Sandbox Code Playgroud)

mysql select query-refactor

7
推荐指数
1
解决办法
4531
查看次数

你如何重构一个丑陋的过程/查询?

我继承了一个数据库,其中包含几个 1000-1500 行长的过程,复杂的嵌套子选择在某些地方深达 7 或 8 层。为了我自己的理智,我迫切需要重构它们,但是我怎么能以任何程度的信心开始这样做呢?

如果这是 .Net,我会编写单元测试 - 您是否推荐类似的方法?

stored-procedures query-refactor

6
推荐指数
1
解决办法
766
查看次数

对此的替代查询(避免 DISTINCT)

注意:我使用 MSSQL 2008,但我想它对许多其他数据库引擎有效 我有这个表“用户”:

用户 ID 用户国家 ID
1 用户 1 1
2 用户 2 2
3 用户 3 3
4 用户 4 4
5 用户 5 4
6 用户 6 3

而这张表“国家”

CountryID 国家
1 MX
2 美国
3 CAN
4 英格兰

如您所见,每个用户都属于一个国家。

如果我想知道,我在用户表上至少拥有一个用户的所有不同国家/地区,现在我执行以下查询:

select distinct country 
from Users inner join
countries on users.CountryID=countries.CountryID
Run Code Online (Sandbox Code Playgroud)

并实现下一个结果集:

能够
英国
MX
美国 

这确实是所有不同的国家,其中我在 muy 表 Users 上至少有一个用户。

我的疑问是,是否可以在不使用“DISTINCT”的情况下实现上述结果集,我的意思是只使用 JOINS 和条件?

这是 de DDL 脚本:

使用 [测试]
走
/****** 对象:表 [dbo].[用户] 脚本日期:09/21/2012 16:21:14 …

sql-server-2008 join query query-refactor

4
推荐指数
2
解决办法
4万
查看次数

PostgreSQL 查询重构

我有一个简单的表叫做事件

它有日期、开始时间、结束时间和状态

我在同一日期有多个事件,开始和结束。

要知道是否有人可以预约,我必须检查该日期和开始,结束我是否有一条状态为假(未占用)的行。

带有一些示例代码的表定义:

CREATE SEQUENCE events_id_seq;

CREATE TABLE events(
  id int4 NOT NULL DEFAULT nextval('events_id_seq'::regclass),
  event_date date NULL,
  status bool NULL DEFAULT false,
  event_start time NULL,
  event_end   time NULL
) ;

INSERT INTO events(event_date,status,event_start,event_end)
VALUES
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', FALSE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00');

select distinct event_date, event_start, event_end, (
    select count(*) from events e1
    where 
        e1.status = false and
        e1.event_date = e.event_date …
Run Code Online (Sandbox Code Playgroud)

postgresql query-refactor

4
推荐指数
1
解决办法
491
查看次数