标签: query

Oracle:如何查询分层表?

背景

这是为了构建我们将用于报告的一些视图。

我有一个位置表,关键字段是 "location" 和 "parent"

这两个字段创建的结构在级别上是沿着公司名称 --> 校园名称 --> 建筑物名称 --> 楼层名称 --> 房间名称。在这种情况下,公司名称保持不变,校园名称保持不变。

位置的结构通常如下所示:

                                 +-----------+
                                 | Org. Name |
                                 +-----+-----+
                                       |
                                 +-----v-----+
           +--------------------+|Campus Name|+---+--+-------------+
           |                     +--+--------+    |                |
           |                        |             |                |
           |                        |             |                |
        +--+-----+           +------+-+        +--+----+       +---+---+
    +--+| BLDG-01|+--+       | BLDG-02|        |BLDG-03|       |Grounds|
    |   +--------+   |       +--------+        +-------+       +-------+
  +-+------+   +-----+--+
  |Floor-01|   |Basement+-------+
  +-+------+   +--------+       |
    |                           |
    |                           |
    | +----------+      +-------+--+
    +-+Room 1-001|      |Room B-002|
      +----------+      +----------+
Run Code Online (Sandbox Code Playgroud)

每个位置都链接回其父位置,最终是组织名称。目前,只有一个组织和一个校区。

目标

  • 我希望能够在“建筑物”级别查询任何给定位置下的所有位置。这样我就可以返回诸如在给定建筑物内的任何位置执行了多少工单之类的信息。 …

oracle query hierarchy view

10
推荐指数
2
解决办法
7335
查看次数

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

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

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
查看次数

查询最佳匹配项并对其进行排序

我正在尝试按照以下方式编写查询:

select * 
from tbl 
where 
       col1 = 1 
   and col2 = 2 
   and col3 = 3
order by
   ...
;
Run Code Online (Sandbox Code Playgroud)

我首先想要所有 3 个WHERE条件匹配的所有结果(3/3),然后是任何 2 个条件匹配的所有结果(2/3),最后是任何 1 个条件匹配的结果(1/3)。

这 3 个结果集中的每一个都需要按 排序(col4, col5, col6)

我可以在单个查询中做到这一点吗?

例如:

示例 http://img708.imageshack.us/img708/1646/sampletableresult1.jpg

创建测试数据的脚本:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') AND type in (N'U'))
    DROP TABLE [dbo].[MyTable]
GO

CREATE TABLE dbo.MyTable
(
    col1 INT
    , col2 INT 
    , col3 INT 
    , col4 INT 
    , col5 INT 
    , …
Run Code Online (Sandbox Code Playgroud)

ms-access query order-by

9
推荐指数
1
解决办法
3543
查看次数

如何向存储过程提交项目列表以限制结果?

可能的重复:将
数组参数传递给存储过程

假设您想通过唯一标识符列表过滤结果,以便您的 SQL 语句读取:

WHERE CustomerID in (@CustomerIDs)
Run Code Online (Sandbox Code Playgroud)

这可能吗?

编辑:

为了澄清和回答尼克的问题,我想将值列表从 C# 传递到 SQL Server,并且能够执行类似于我上面发布的 SQL 的选择。由于存在大量数据,因此这比获取比需要的更多的数据并不得不搜索它更可取。

sql-server query stored-procedures

8
推荐指数
3
解决办法
1万
查看次数

SQL Server - 多个运行总计

我有一个包含事务的基表,我需要创建一个带有运行总计的表。我需要它们是每个帐户,并且每个帐户都有一些运行总计(取决于交易类型),在其中,每个子帐户都有一些运行总计。

我的基表有这些字段(或多或少):

AccountID  |  SubAccountID   |  TransactionType  |  TransactionAmount
Run Code Online (Sandbox Code Playgroud)

考虑到我每个 Account/TransactionType 有大约 4 种类型的运行总计,每个 Account/SubAccount/TransactionType 有 2 个以上的运行总计,我有大约 200 万个账户,每个账户有大约 10 个子账户,我收到了大约 1 万笔交易每分钟(在最大负载下),你会怎么做?

这也是必须通过 SQL 作业异步运行,创建聚合而不是事务本身的一部分。

我在这里使用光标很困难 - 这需要太长时间。我真的很感激任何或多或少相同的建议/文章。

performance sql-server query scalability

8
推荐指数
3
解决办法
2990
查看次数

在全文搜索查询中优化 ORDER BY

我有一张大桌子,里面entities有大约 1500 万条记录。我想在他们的name.

我在 上有一个全文索引name,用于:gin_ix_entity_full_text_search_name

询问:

 SELECT "entities".*,
         ts_rank(to_tsvector('english', "entities"."name"::text),
         to_tsquery('english', 'hockey'::text)) AS "rank0.48661998202865475"
    FROM "entities" 
         WHERE "entities"."place" = 'f' 
              AND (to_tsvector('english', "entities"."name"::text) @@ to_tsquery('english', 'hockey'::text)) 
         ORDER BY "rank0.48661998202865475" DESC LIMIT 5
Run Code Online (Sandbox Code Playgroud)

持续时间 25,623 毫秒

解释计划
1 限制(成本=12666.89..12666.89 行=5 宽度=3116)
2 -> 排序(成本=12666.89..12670.18 行=6571 宽度=3116)
3 排序键: (ts_rank(to_tsvector('english'::regconfig, (name)::text), '''hockey'''::tsquery))
4 -> 实体上的位图堆扫描(成本 = 124.06..12645.06 行 = 6571 宽度 = 3116)
5 重新检查条件: (to_tsvector('english'::regconfig, (name)::text) @@'''hockey'''::tsquery)
6 过滤器:(不是地方)
7 -> gin_ix_entity_full_text_search_name 上的位图索引扫描(成本=0.00..123.74 行=6625 …

postgresql performance query full-text-search postgresql-performance

8
推荐指数
3
解决办法
3891
查看次数

从同一个表中选择两个值但条件不同

我想将表中的值抓取到同一表中不同值的两个不同列中。使用此查询作为示例(注意选择是如何在别名为 2 个不同表的同一个表上的):

SELECT a.myVal, b.myVal 
FROM MyTable a, MyTable b
WHERE 
  a.otherVal = 100 AND
  b.otherVal = 200 AND
  a.id = b.id
Run Code Online (Sandbox Code Playgroud)

当我在我的数据集上运行这样一个相对简单的查询时,它可以工作 - 只是需要很长时间。有没有更好/更聪明的方式来编写这个查询?

query reporting

8
推荐指数
1
解决办法
18万
查看次数

即使在 Disabling Read-Ahead 和 clearing buffer 之后,为什么还有 Logical Read?

当所有数据页都应仅在磁盘中时,我必须找到在 SQL-SERVER 2016 中执行查询所需的总时间。为此,我使用以下命令清除了 SQL-SERVER 中的所有缓冲区:

DBCC FREEPROCCACHE WITH NO_INFOMSGS
GO
DBCC DROPCLEANBUFFERS
GO
DBCC FREESESSIONCACHE
GO
DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL
GO 
DBCC FLUSHPROCINDB (@dbId)
GO
Run Code Online (Sandbox Code Playgroud)

在此之后,我再次发现存在逻辑读取,然后我了解了 Read-Ahead ,因此我通过跟踪标志禁用了预读

DBCC TRACEON(652,-1)
GO
Run Code Online (Sandbox Code Playgroud)

以及预取标志

DBCC TRACEON(8744,-1)
GO
Run Code Online (Sandbox Code Playgroud)

现在我仍然有逻辑读取,但物理读取明显高于清除缓冲区。有什么办法可以实现0逻辑读,还是我对逻辑读的理解有误?

请指导我,我是 SQL-SERVER 世界的新手

sql-server query cache

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

XML 查询问题

我正在尝试生成 SQL 查询以从以下 SQL XML 中获取“DATE”值:

截屏

我试过这样的事情,但我不认为我理解这些概念。

select 
   xConfig.value('(/SearchjobConfig/QueryString/SearchCriteria/ExpressionSet/SimpleAttributeExpression) [1]','nvarchar(max)') 
from 
    Job 
Run Code Online (Sandbox Code Playgroud)

这是作为文本的 XML:

select 
   xConfig.value('(/SearchjobConfig/QueryString/SearchCriteria/ExpressionSet/SimpleAttributeExpression) [1]','nvarchar(max)') 
from 
    Job 
Run Code Online (Sandbox Code Playgroud)

预期的输出将是日期:

<SearchJobConfig>
  <QueryID>1072</QueryID>
  <QueryString>
    <SearchCriteria name="Search query" >
      <ExpressionSet logicalOperator="AND">
        <SimpleAttributeExpression displayName="Date" npmPropertyId="4" searchOperation="GREATER_EQUAL" dataType="string" caseSensitive="false">2019-06-01T04:00:00</SimpleAttributeExpression>
        <SimpleAttributeExpression displayName="Date" npmPropertyId="4" searchOperation="LESS_EQUAL" dataType="string" caseSensitive="false">2019-06-13T03:59:59</SimpleAttributeExpression>
        <SimpleAttributeExpression displayName="Class" npmPropertyId="1056" searchOperation="EQUALS" dataType="int32" caseSensitive="false">65</SimpleAttributeExpression>
      </ExpressionSet>
    </SearchCriteria>
  </QueryString>
</SearchJobConfig>
Run Code Online (Sandbox Code Playgroud)

以及在同一行上获得结果需要什么..示例:

2019-06-01T04:00:00
2019-06-13T03:59:59
Run Code Online (Sandbox Code Playgroud)

我正在使用 SQL Server 2012 企业版。

xml sql-server query sql-server-2012

8
推荐指数
1
解决办法
194
查看次数

逻辑运算符使用不当导致查询性能不佳

我有一个包含大量数据(近 1500 万)且结构如下的表。

create table test
(a int,--> /* There is a normal index on this column */
 b int,
<other columns>)
Run Code Online (Sandbox Code Playgroud)

有一个从此表中进行选择的查询,其中 where 子句中的条件之一是:

where a!=1 or (a=1 and b!=0) /* The original condition */
Run Code Online (Sandbox Code Playgroud)

查询非常慢,我认为这种糟糕的性能大部分可能是由于逻辑运算符使用不当造成的。我已经改变了条件,如下所示:

where not (a=1 and b=0) /* The edited version*/
Run Code Online (Sandbox Code Playgroud)

并且性能发生了巨大的变化!我需要确定的是这两个条件完全相同,这样我就不会错过任何数据。我想知道您是否可以帮助我解决这个问题并告诉我您是否有更好的选择来治疗这种情况。

如果您知道任何有关逻辑运算的正确使用以及/顺序优化器处理它们的方式的文章,请分享链接。

提前致谢

sql-server query t-sql sql-server-2016 query-performance

8
推荐指数
1
解决办法
2241
查看次数