标签: select

从每一列中选择最大值,即使其中一个值为空

我有一张road_age_test桌子:

create table road_age_test (
    surface_year int,
    base_year int
);

insert into road_age_test (surface_year, base_year) values (10,20);
insert into road_age_test (surface_year, base_year) values (30,null);
insert into road_age_test (surface_year, base_year) values (null,40);
insert into road_age_test (surface_year, base_year) values (null,null);
insert into road_age_test (surface_year, base_year) values (50,50);

commit;

select * from road_age_test;

SURFACE_YEAR  BASE_YEAR
------------ ----------
          10         20
          30       null    
        null         40
        null       null
          50         50
Run Code Online (Sandbox Code Playgroud)

我想从每一列中选择最大值,即使其中一个值为空:

GREATEST_YEAR
-------------
           20
           30
           40
         null
           50
Run Code Online (Sandbox Code Playgroud)

什么是最简单的方法来做到这一点?


注意:如果两个值都是null,我想返回null, …

null oracle select oracle-12c

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

在不使用子查询的情况下选择行中的上一个值

假设您在 PostgreSQL 11 中有一个表,其中包含如下所示的值集。

12 18
11 12
5  12
9  18
7  19
14 18
11 16
6  12
4  11
5  9
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以在不使用子选择的情况下进行选择,或者通过使用函数或触发器/函数来查找每个值低于先前值或可能高于先前值的位置,但此示例低于先前值(可能是 2 行或15+ 行)在列和第一列中都高于最后一行或第一列和第二列以终止选择,使条件为正?

我不知道如何在选择中包含当前变量。如果我可以回顾变量那么我应该能够做到这一点。我想知道是否有人遇到过这个问题,并使其在选择中工作,或者他们在数据库之外进入 GoLang / Python / C++ / Perl / PHP / 等。一旦我离开数据库,做起来非常简单,但我我真的很想将其保留在 PostgreSQL 11 中。

postgresql select postgresql-11

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

为每个组选择除 Max(date) 之外的所有内容

我有一张桌子,除了每个 groupID 的最大日期之外,我还想在其中提取所有内容。有没有简单的方法来做到这一点?

这是我想要做的:

SELECT 
groupId, 
Types,
MAX(Dates) as date

FROM TableData

Where Dates < Max(dates)

GROUP BY 
groupId, 
Types

//The table looks as follows:
ID      |   GroupID | Date
1       |     A     | 10-10-2020 -> don't show
2       |     A     | 09-10-2020
3       |     A     | 08-10-2020
4       |     B     | 10-10-2020 -> don't show
5       |     B     | 09-10-2020
6       |     B     | 08-10-2020


//Expected result:
GroupID | Date
  A     | 09-10-2020
  A     | 08-10-2020
  B     | 09-10-2020 …
Run Code Online (Sandbox Code Playgroud)

sql-server select

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

为什么低选择性列上的索引会损害查询性能

表很简单:

CREATE TABLE `t1` (
  `ID` int NOT NULL AUTO_INCREMENT,
  `name` int DEFAULT '1',
  `LastName` int DEFAULT '0',
  UNIQUE KEY `idx_ID` (`ID`) USING BTREE,
  KEY `idx_name` (`name`)
) ENGINE=InnoDB;

DELIMITER $$
DROP PROCEDURE IF EXISTS populate_t1;
CREATE PROCEDURE populate_t1(IN num INT)
BEGIN
    DECLARE COUNT INT DEFAULT 0;
    WHILE COUNT < num DO
        INSERT INTO t1(`name`,`LastName`) VALUES(round(rand()+5, 0), round(rand()*10000, 0));
        SET COUNT = COUNT + 1;
    END WHILE;
END $$
DELIMITER ;

CALL populate_t1(1000000);
CREATE INDEX idx_name ON t1 (`name`);
OPTIMIZE …
Run Code Online (Sandbox Code Playgroud)

mysql performance index select

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

如何在“IN”语句中使用关键字“VALUES”?

我在 sql server 2016

select @@version
Run Code Online (Sandbox Code Playgroud)

Microsoft SQL Server 2016 (SP2-CU15) (KB4577775) - 13.0.5850.14 (X64) Sep 17 2020 22:12:45 版权所有 (c) Microsoft Corporation Enterprise Edition:Windows Server 2012 R2 上的基于内核的许可(64 位)数据中心 6.3(内部版本 9600:)(管理程序)

在 sql server 中的一个简单插入语句中,我有关键字 values

例如:

BEGIN TRANSACTION T1
SELECT @@TRANCOUNT

INSERT INTO [APCore].[usr].[userBusinessArea]
           ([businessAreaID]
           ,[userID])
     VALUES
           (21, 368), 
           (21, 227419) ,
           (21, 99906), 
           (21, 140470)


SELECT [1]= @@TRANCOUNT
--COMMIT TRANSACTION T1
--ROLLBACK
SELECT [2]=@@TRANCOUNT
Run Code Online (Sandbox Code Playgroud)

问题是,在我运行插入之前,我想使用与 相同的逻辑values来找出这些记录中是否已经有任何记录在表中。

否则你可能会得到这样的结果:

在此处输入图片说明

我的做法是:

select top 10 * from
[APCore].[usr].[userBusinessArea]
where …
Run Code Online (Sandbox Code Playgroud)

sql-server query syntax insert select

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

从一个表中选择一行,如果不存在,从另一个表中选择

如何从一个表中选择一行,但如果它不存在,则回退到从辅助表中选择它?这是我想要实现的简化版本

create table table_1 (
  person TEXT,
  favourite_number INT
  );
  
  create table table_2 (
    person TEXT,
    favourite_number INT
  );
  
  insert into table_1 (person, favourite_number) values 
  ('Bob', 1),
  ('Fred', 2)
  ;
  
    insert into table_2 (person, favourite_number) values 
  ('Bob', 30),
  ('Alice', 70)
  ;
Run Code Online (Sandbox Code Playgroud)

我想得到以下结果:

| person | favourite_number |
|--------|------------------|
| Bob    | 1                |
| Alice  | 70               |
| Fred   | 2                |
Run Code Online (Sandbox Code Playgroud)

注意它如何从第一个表中选择 Bob 和 Fred。即使鲍勃出现在第二张桌子上,因为我们已经拿到了他,我们还是把他从第一张桌子上拿走了。Alice 只出现在第二个表中。

到目前为止,这是我尝试过的,但我无法让所有 3 个返回,请帮助。

select
  t1.*
from table_1 t1
where t1.person not in …
Run Code Online (Sandbox Code Playgroud)

postgresql select postgresql-9.6

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

如何在 SQL (Firebird) 中获取下周的日期?

我想使用 SQL 语句获取日期。例如,如果日期是“2018-08-07”输出,则应返回:“2018-08-14”(一周后)。然后我将获取这些日期之间的总行数。

SELECT count(*) FROM orders  WHERE dates BETWEEN '2018-08-07'  AND 
DATEADD(day,7,'2018-08-07');
Run Code Online (Sandbox Code Playgroud)

但是,由于 dateadd() 函数,我收到此错误:

SQL Error [335544634] [42000]: Dynamic SQL Error; SQL error code = -104; Token unknown - line 1, column 1; DATEADD [SQLState:42000, ISC error code:335544634]
Run Code Online (Sandbox Code Playgroud)

select firebird date

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

简单的选择语句没有返回正确的数据

我正在尝试返回数据,其中我想要来自 3 个不同表 (商品、供应商和价格)使用来自价格的外键 vid(供应商 ID)。好。

下面是表格的样子:

mysql> describe prices;
+-------+------------------------+------+-----+---------+----------------+
| Field | Type                   | Null | Key | Default | Extra          |
+-------+------------------------+------+-----+---------+----------------+
| pid   | int(10) unsigned       | NO   | PRI | NULL    | auto_increment |
| price | decimal(10,2) unsigned | YES  |     | NULL    |                |
| url   | longtext               | YES  |     | NULL    |                |
| iid   | int(10) unsigned       | NO   | MUL | NULL    |                |
| vid   | tinyint(3) unsigned …
Run Code Online (Sandbox Code Playgroud)

mysql join select

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

在 sql 中管理选择结果

我们需要操作从选择查询返回的一组记录。这可以在:

  1. 通过将整个记录保存到表变量中,然后执行所需的过程。
  2. 我们可以这样做

    Select * from
       (select * from table where conditions) AS results
       where results.RowNum between ....
    
    Run Code Online (Sandbox Code Playgroud)

    那么在这种情况下最好的方法是什么..使用表变量或第二种方法。与第一种方法相比,使用第二种方法是否存在任何性能问题?

sql-server select

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

“不明确的列名”错误指的是数据库、表和列 guuu

sqlite3 在下面的查询中给出了“不明确的列名”错误。错误本身引用了一个可以想象的明确列名,将数据库标识为“sourcedb”,将表标识为“答案”,将字段标识为“标记”。为什么这个查询会触发错误?

sqlite> SELECT answers.*
        FROM   sourcedb.answers
               INNER JOIN sourcedb.questions_tests
                 ON sourcedb.questions_tests.testskey = '121212eczema'
               INNER JOIN sourcedb.answers_questions
                 ON sourcedb.questions_tests.questionskey = sourcedb.answers.questionskey
               INNER JOIN sourcedb.answers
                 ON sourcedb.answers.answerskey = sourcedb.answers_questions.questionskey; 
...>    ...>    ...> Error: ambiguous column name: sourcedb.answers.markup
Run Code Online (Sandbox Code Playgroud)

一些额外的细节...

sqlite> pragma table_info(answers);
0|markup|TEXT|0||0
1|identifier|TEXT|0||0
2|text|TEXT|0||0
3|answerskey|INTEGER|0||1
4|answertype|TEXT|0||0
5|ReadPerms||0||0
6|UpdatePerms||0||0
7|DeletePerms||0||0
sqlite> pragma database_list;
0|main|
2|sourcedb|/root/.ttest/database/sqlite/ttest-simple.sqlite
Run Code Online (Sandbox Code Playgroud)

sqlite select

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