标签: clause

与参数一起使用时如何优化"OR"子句的使用(SQL Server 2008)

我想知道是否有任何明智的方法来重写以下查询,以便优化器使用列上的索引?

Create Procedure select_Proc1
    @Key1 int=0,
    @Key2 int=0
As
BEGIN
    Select key3
    From Or_Table
    Where (@key1 =0 OR Key1 =@Key1) AND
          (@key2 =0 OR Key2 =@Key2)
END
GO
Run Code Online (Sandbox Code Playgroud)

即使WHERE子句中的列被索引覆盖,SQL Server也无法使用这些索引.这提出了一个问题,即是否有任何东西"阻止"索引的使用.这个问题的答案是肯定的 - 罪魁祸首是参数和"或"条件.索引不包含这些参数,这意味着SQL Server无法使用任何索引来评估"@ key1 = 0"(同样适用于@ key2 = 0的条件).实际上,这意味着SQL Server无法使用索引来评估子句"@ key1 = 0 OR Key1 = @ key1"(因为"OR"子句是两个条件所涵盖的行的并集).同样的原则也适用于其他条款(re.key2).这导致SQL Server得出结论,没有索引可用于提取行,使SQL Server能够利用下一个最佳方法 - 聚簇索引扫描

如您所见,如果WHERE子句中的谓词为"OR",则SQL优化器将不使用列上的索引.针对此问题的一种解决方案是使用IF子句为所有可能的参数组合分隔查询.

请阅读这篇简短的文章,以便更好地了解问题:http://www.sql-server-performance.com/articles/per/optimize_or_clause_p1.aspx

现在我的问题是,如果可能的组合只有三到四个,我们该怎么办?为每个组合编写单独的查询似乎不是一个合理的解决方案.这个问题还有其他解决方法吗?

sql-server indexing performance clause

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

Elixir:函数重载与不同的arity

有没有办法用不同的arity定义重载函数,例如在C#中我可以这样做:

foo(bar)
Run Code Online (Sandbox Code Playgroud)

要么

foo(bar, baz)
Run Code Online (Sandbox Code Playgroud)

在Elixir中,唯一的方法是将它们放在单独的模块中,这将很快变得混乱.它有什么办法吗?

编辑:我做了一个错误的假设.我看到的重载函数的例子恰好具有相同的特性,所以我(错误地)认为这是一个要求.函数由其名称和arity唯一标识,因此您实际上可以使用不同的arity重载函数.

overloading function clause elixir arity

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

条件左边加入CriteriaQuery

大家好我想在CriteriaQuery中做这个,我搜索了这么久但我找不到任何可以做到的,有人可以帮助我吗?

SELECT b.name
FROM Empl a 
LEFT OUTER JOIN Deplo b ON (a.id_depl = b.id_depl) AND b.id_place = 2;
Run Code Online (Sandbox Code Playgroud)

我只是试图在左连接子句中做一个条件,我看到".on"函数,但我不知道它是否会起作用以及它是如何工作的,因为我试图做这样的事情:

Join Table1, Table2j1 = root.join(Table1_.table2, JoinType.LEFT).on(cb.and(cb.equal(table2_.someid, someId)));
Run Code Online (Sandbox Code Playgroud)

但它需要一个布尔表达式.

orm jpa clause left-join criteriaquery

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

MySQL where 子句和 avg() 排序作为子查询

尽管我可以对别名子查询进行分组和排序,但我无法在 where 子句中使用别名。我需要使用联接吗?

作品:

SELECT entries.*, 
    (SELECT avg(value) 
    FROM `ratings`
    WHERE ratings.entry_id = entries.id) as avg_rating
FROM `entries` 
ORDER BY avg_rating DESC
Run Code Online (Sandbox Code Playgroud)

失败(“where 子句中的未知列 'avg_ rating'”):

SELECT entries.*, 
    (SELECT avg(value) 
    FROM `ratings` 
    WHERE ratings.entry_id = entries.id) as avg_rating 
FROM `entries` 
WHERE avg_rating < '4.5000' ORDER BY avg_rating DESC
Run Code Online (Sandbox Code Playgroud)

mysql average subquery clause where-clause

5
推荐指数
1
解决办法
8980
查看次数

Erlang索引子句是如何处理的?

我来自Prolog背景.Prolog通常对谓词的第一个参数进行索引(大多数体面的系统允许你改变它,对多个参数进行索引等).无论如何,了解引擎索引子句如何允许您安排参数和谓词以获得更好的性能.

我最近在Erlang编写了一些代码,但是没有看到有关它如何索引子句头的任何信息,以及我应该如何安排参数和子句.谁知道?

谢谢.

indexing erlang clause

5
推荐指数
1
解决办法
159
查看次数

在[IN]的rails with或子句中搜索

我在rails中使用此查询

此处@album_ids,@country_ids是数组

@audios= Audio.where({:album_id => @album_ids, :country_id => @country_ids})
It produces following SQL:

 Audio Load (0.3ms)  SELECT `audios`.* FROM `audios` WHERE `audios`.`album_id` IN (1, 2) AND `audios`.`country_id` IN (1, 2)
Run Code Online (Sandbox Code Playgroud)

但我想将查询生成为:

 Audio Load (0.3ms)  SELECT `audios`.* FROM `audios` WHERE `audios`.`album_id` IN (1, 2) OR `audios`.`country_id` IN (1, 2) 
Run Code Online (Sandbox Code Playgroud)

OR 而不是 AND

提前致谢

database ruby-on-rails clause where

5
推荐指数
1
解决办法
3548
查看次数

如何在FSharp查询表达式中使用复合键子句编写连接?

如何用F#中的复合键子句写这个C#join?:

join k in DataContext.Catalogs on
   new { id = o.IDENT, v = o.VZ } equals
   new { id = k.IDENT, v = k.VZ }
Run Code Online (Sandbox Code Playgroud)

这是类似的问题: 在F#3.0查询中多列组合,仍然没有得到答案.但我无法相信在FSharp中编写它并不容易.

谢谢

f# join clause c#-to-f#

5
推荐指数
1
解决办法
839
查看次数

MySQL group_concat with where子句

我用Group_Concat和where过滤器遇到了这个问题.在我的表中,我得到了与客户端链接的模块名称.我想按模块名称搜索客户端,但在组concat中我仍然希望查看客户端拥有的所有模块.目前它将显示具有这些模块的所有客户端,但它只显示该特定模块.我无法弄清楚如何使它们一起工作.

关于如何获得我的预期结果的任何建议?

这些是一些基本的表和我尝试的结果以及我得到的结果和我真正想要的结果

Client
+--------------------+
| id      |  name    |
+--------------------+
| 1       | client1  |
| 2       | client2  |
| 3       | client3  |
| 4       | client4  |
+--------------------+

Module
+--------------------+
| id      |  name    |
+--------------------+
| 1       | module1  |
| 2       | module2  |
| 3       | module3  |
| 4       | module4  |
+--------------------+

Client_Module
+-------------------------+
| client_id  | module_id  |
+-------------------------+
| 1          | 2          |
| 1          | 3          |
| …
Run Code Online (Sandbox Code Playgroud)

mysql sql clause where group-concat

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

WHERE子句谓词可以评估为NULL吗?

WHERE子句可以返回NULL而不是TRUE或FALSE吗?根据下面的练习,它是可能的,但我无法想象一个返回NULL的例子,它真的可能吗?

4. Which of the following values can NOT be returned after evaluation of WHERE clause
condition?
A.  UNKNOWN
B.  TRUE
C.  FALSE
D.  NULL
Answer: A. If the result of the condition in WHERE clause is not known, NULL is returned. In all
other scenarios, either TRUE or FALSE is returned.
Run Code Online (Sandbox Code Playgroud)

sql oracle null clause where

5
推荐指数
1
解决办法
906
查看次数

MySQL ONLY IN()等效子句

我在这里给出了一个非常抽象的问题版本,所以请耐心等待.我有一个查询,将检查特定的主体是否具有相同类型的某些多个参数.例如,就巧克力而言,男孩有多种选择.但是,我想从桌子上选择那些我提到的巧克力的男孩.不仅不是更少,也不是'喜欢'或不'IN()'.

SELECT boy_id from boys_chocolates WHERE chocolate_id ONLY IN('$string');
Run Code Online (Sandbox Code Playgroud)

..当然'$ string'是一个PHP变量,包含逗号分隔值,只包含那些我想用来吸引男生的巧克力.

我知道这是无效的MySQL语句,但有没有任何有效的相当于此?

编辑:

这是更全面的查询,它在特殊情况下获取记录,但并非总是如此.

SELECT boys.* FROM schools_boys INNER JOIN boys ON boys.boy_id=schools_boys.boy_id
INNER JOIN chocolates_boys a ON a.boy_id=boys.boy_id INNER JOIN schools
ON schools.school_id=schools_boys.school_id WHERE a.chocolate_id IN(1000,1003)
AND 
            EXISTS
            (
                    SELECT 1
                    FROM chocolates_boys b
                    WHERE a.boy_id=b.boy_id
                    GROUP BY boy_id
                    HAVING COUNT(DISTINCT chocolate_id) = '2'
                    )

                GROUP BY schools_boys.boy_id HAVING COUNT(*) = '2'

Boys Table
+--------+-------------+
| id     | boy         |
+--------+-------------+
| 10007  | Boy1        |
| 10008  | …
Run Code Online (Sandbox Code Playgroud)

mysql clause relational-division

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