我有一张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, …
假设您在 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 中。
我有一张桌子,除了每个 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) 表很简单:
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) 我在 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) 如何从一个表中选择一行,但如果它不存在,则回退到从辅助表中选择它?这是我想要实现的简化版本
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) 我想使用 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) 我正在尝试返回数据,其中我想要来自 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) 我们需要操作从选择查询返回的一组记录。这可以在:
我们可以这样做
Select * from
(select * from table where conditions) AS results
where results.RowNum between ....
Run Code Online (Sandbox Code Playgroud)
那么在这种情况下最好的方法是什么..使用表变量或第二种方法。与第一种方法相比,使用第二种方法是否存在任何性能问题?
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) select ×10
sql-server ×3
mysql ×2
postgresql ×2
date ×1
firebird ×1
index ×1
insert ×1
join ×1
null ×1
oracle ×1
oracle-12c ×1
performance ×1
query ×1
sqlite ×1
syntax ×1