标签: select

使用 SELECT 列表中的表达式来精简 CASE 语句

我有一个查询,我通过重写工作-它有一个巨大的一堆case文中陈述select列表中的所有基本是这样的:

select
    Column1 = 
        case when (Something = 2) and (SomethingElse is null) and (AnotherThing in (1, 2))
        then 1 
        else 0
        end,
    Column2 = 
        case when (Something = 3) and (SomethingElse is not null) and (AnotherThing in (2, 3))
        then 1 
        else 0
        end,
    ...
Run Code Online (Sandbox Code Playgroud)

特别注意when <expressions> then 1 else 0所有这些通用的“ ”逻辑。

它看起来真的很臃肿和冗长,是对case语句的粗暴使用- 我的编程大脑告诉我这可以通过一些基本的二进制&逻辑更简洁地实现,case完全删除:

select
    Column1 = (Something = 2) & (SomethingElse is null) & …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 select case

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

选择现有表,其中 ID 在另一个表中

我有一个包含 ~35k IDs ( TableC) 的表,一个包含多列 ( TableA) 的ID表,其中包括前面提到的表和第三个空表,具有与第二个表 ( TableB)相同的列。

现在,我需要每个条目从复制TableATableB其中IDTableATableC。我想出了这个查询:

SELECT * INTO TableB
FROM TableA
WHERE ID IN
(SELECT ID FROM TableC)
Run Code Online (Sandbox Code Playgroud)

但这会导致错误There is already an object named 'TableB' in the database... 我不允许为此删除和重新创建TableB

使用 Microsoft SQL Server Enterprise Edition v9.00.3042.00,即 SQL Server 2005 Service Pack 2

我怎么能每个条目将复制TableATableB其中IDTableATableC

sql-server-2005 sql-server select copy

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

WHERE NAME LIKE (一组名字)

我想删除与一组特定数据库相关的所有作业。

因此,我已将所有名称添加到表变量中,并尝试生成脚本以删除作业。

我怎样才能做到这一点?

use msdb
go


DECLARE @R TABLE ( NAME VARCHAR(108) NOT NULL PRIMARY KEY CLUSTERED)

INSERT INTO @R(NAME)
SELECT 
'UK15SUMMProduct' UNION ALL SELECT 
'US15SUMMProduct' UNION ALL SELECT 
'DE15SUMMProduct' UNION ALL SELECT 
'AT15SUMMProduct' UNION ALL SELECT 
'FR15SUMMProduct' UNION ALL SELECT 
'EU15SUMMProduct' UNION ALL SELECT 
'AU15SUMMProduct' UNION ALL SELECT 
'UK15SUMSProduct' UNION ALL SELECT 
'US15SUMSProduct' UNION ALL SELECT 
'DE15SUMSProduct' UNION ALL SELECT 
'AT15SUMSProduct' UNION ALL SELECT 
'FR15SUMSProduct' UNION ALL SELECT 
'EU15SUMSProduct' UNION ALL SELECT 
'AU15SUMSProduct'


SELECT S.* 
FROM SYSJOBS S
WHERE …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 select sql-server-2012 sql-server-2014

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

查询谁支付了超过 10k

我有一张包含付款信息的表格,如下所示:

ID COSTUMER_ID DATEPAID     AMOUNT
1    1        2012-01-01      50
2    1        2012-02-01      100
3    1        2012-03-01      70
4    2        2012-03-01     6000
4    2        2012-09-01     3000
4    2        2014-04-01     8000
5    3        2013-03-01     9000
6    3        2013-08-01     3000
Run Code Online (Sandbox Code Playgroud)

等等。我需要知道哪些客户在 12 个月内支付了超过 10,000 美元。(在示例中,只有客户 3 适合)。不要介意什么时候,唯一的标准是在任何连续 12 个月的组合中 SUM(AMOUNT) > 10000。

但我坚持下去。有任何想法吗?我正在使用 SQL Server 2012。

sql-server select sql-server-2012

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

从查询中检索特定结果

我有以下数据库表

Firstname  Varchar(40)
Surname    Varchar(40)
Department Binary
JobCode    Char(1)
Run Code Online (Sandbox Code Playgroud)

通常情况下,提取特定部门的记录是没有问题的。部门字段是一个由 7 部分组成的字段,每一位代表一个特定的部门,允许系统轻松显示人们在一个或多个部门工作的位置。假设 John Smith 的工作代码为 K,而 Freda Williams 的工作代码为 M。

同样,返回特定部门的记录非常简单。但是,如果 John Smith 临时晋升到同一部门,而不是更改记录,则会添加一个带有职位代码 F的额外记录。本质上,职位代码字母越低,等级越高。

因此,如果我们要检索 John Smith 的当前详细信息,很简单,选择姓名为 John Smith 的记录,按 Job Code Asc, Limit (1) 排序。

但是,提取一个部门的所有记录的 SQL 语句是什么,但要确保John Smith只出现一个记录,而且它是“F”记录?任何人都可以帮忙吗?我原以为子查询可能会对它进行排序,但不知道如何排序。

mysql select

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

将列从数字字符串转换为选择语句的小计

这可能非常基本,但我一直在努力弄清楚。我环顾四周,但找不到任何类似的问题。我正在使用 SQL Server 2008 R2

我有一个观点:

ID  |           VALUE
1   | 151;181;179;185;160;187
2   | 185;160
3   | 151;181;179;185;150
4   | 185;160;187
5   | 187
Run Code Online (Sandbox Code Playgroud)

我想要一个选择语句来产生这个结果:

ID  |           VALUE
1   |           1043
2   |           345
3   |           846
4   |           532
5   |           187
Run Code Online (Sandbox Code Playgroud)

sql-server select

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

如何使用 join 和 order-by 优化此选择?

我们有两个表:

 CREATE TABLE `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created` int(10) unsigned DEFAULT '0',
  `user_id` int(11) DEFAULT '0',
....
  `subject_id` int(11) unsigned DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `user_id` (`user_id`),
  KEY `created` (`created`),
  KEY `text_id` (`text_id`) USING BTREE,
  KEY `subject_id` (`subject_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=237542180 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
Run Code Online (Sandbox Code Playgroud)

第二个:

CREATE TABLE `users` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `email` char(150) DEFAULT NULL,
  `reg_time` int(10) unsigned DEFAULT '0',
  `password` char(255) DEFAULT NULL,
...................
  `moderation` int(1) …
Run Code Online (Sandbox Code Playgroud)

mysql optimization order-by select aurora

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

选择一组项目的第一个实例

我正在尝试修改从一组客户中提取最新订单并提供 order_type 的现有查询。

当前查询工作正常(虽然有点慢,但下面的所有列都已编入索引):

SELECT 
    DISTINCT(td1.product_id), 
    td1.customer_id, 
    td1.date_test_added,
    tdmi.product_type_id
FROM 
    order_history AS td1
    LEFT JOIN order_history td2     
    ON td1.customer_id = td2.customer_id AND td1.date_test_added < td2.date_test_added
    LEFT JOIN order_types tdmi      
    ON tdmi.product_id   = td1.product_id 
WHERE
   td2.date_test_added IS NULL
   AND tdmi.product_type_id = 31
   AND td1.customer_id IN (91000, 91001, 91002, 91003)
Run Code Online (Sandbox Code Playgroud)

如果我将第一个连接中的小于运算符更改为大于,则不会返回任何结果。

更改此设置以提取最早订单(基于 date_test_ added)的最佳方法是什么?

mysql select greatest-n-per-group

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

从表中选择在另一个表中没有行的数据

我有2张桌子。首先"product" (id)。第二- "product_has_option_value" (product_id, option_value_id)

我怎样才能获得id没有一些的产品option_value_id(例如 10)?“product_has_option_value”具有多对多关系。

好的。我想我找到了解决方案:

select p.id 
from product p 
where p.id not in 
  (select distinct(product_id)
   from product_has_option_value 
   where option_value_id=543)
Run Code Online (Sandbox Code Playgroud)

mysql select if-not-exists

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

Exclude composite key from select

I have 2 identical DBs, one of the tables has C1, C2, C3 , composite key. I'm trying to get the rows from B that are not present in DB A.

I have tried many approaches, but at this time I even can't re-use this suggestion due too the late hour.

I think it should be by something like

Select * from B
where  not exists                
     (SELECT a.C1, a.C2, a.C3
      from A.table as a, b.table as b 
      where a.C1=b.C1
          , …
Run Code Online (Sandbox Code Playgroud)

select

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