假设下面的查询是合法的并且执行成功,有什么办法可以加快速度吗?
SELECT foo from T1 --T1 is a huge (>5e6 rows) table with no indexes
UNION
SELECT bar from T1
UNION
SELECT baz from T1
UNION
SELECT qux from T1
Run Code Online (Sandbox Code Playgroud)
上面显示的四列都是 type nvarchar(128)、非稀疏和可为空的。我使用的是 SQL Server 2008。谢谢!
编辑:提供了更多信息。我无法添加索引,因为它是 Stage 表。另外,删除DISTINCTs; 我完全忘记了这一点。
Phil:我如何将其合并为一个查询?
WITH [ProgressInvoicesPeriodCost] AS
(
SELECT
ProgressInvoices.ProjectId
, ProgressInvoices.PeriodId
, SUM(ProgressInvoiceDetails.TotalThisInvoice) AS TotalThisInvoice
FROM
CostManagement_ProgressInvoices AS ProgressInvoices
LEFT JOIN CostManagement_ProgressInvoiceDetails AS ProgressInvoiceDetails
ON ProgressInvoices.Id = ProgressInvoiceDetails.ProgressInvoiceId
WHERE
ProgressInvoices.ProjectId IN (@Projectlisting)
GROUP BY
ProgressInvoices.ProjectId
, ProgressInvoices.PeriodId
)
[CommitmentCOPeriodCost] AS
(
SELECT
CommitmentCOs.ProjectId
, CommitmentCODetails.PeriodId
, SUM(CommitmentCODetails.AmountApproved) AS AmountApproved
FROM
CostManagement_CommitmentCOs AS CommitmentCOs
LEFT JOIN CostManagement_CommitmentCODetails AS CommitmentCODetails
ON CommitmentCOs.Id = CommitmentCODetails.CommitmentCOId
WHERE
CommitmentCOs.ProjectId IN (@Projectlisting) AND CommitmentCOs.PostAsId = 2
GROUP BY
CommitmentCOs.ProjectId
, CommitmentCODetails.PeriodId
)
[CommitmentPeriodCost] AS
(
SELECT
Commitments.ProjectId
, CommitmentDetails.PeriodId …Run Code Online (Sandbox Code Playgroud) 数据库方案由四个表组成:
的产品表包含的制造者的数据,型号和产品的类型(PC,Laptop,或Printer)。假设产品表中的型号对于所有制造商和产品类型都是唯一的。
PC表中的每台个人计算机都由唯一代码明确标识,并另外通过其型号(外键指产品表)、处理器速度(以 MHz 为单位)-速度列、RAM 容量(以 Mb 为单位)- ram 进行表征、硬盘驱动器容量(以 Gb 为单位)- hd、CD-ROM 速度(例如4x)- cd及其价格。
该笔记本电脑桌类似于PC表,只是代替了CD-ROM的速度,它包含的屏幕尺寸(英寸) -屏幕。
对于打印机表中的每个打印机型号,指定了其输出类型(y彩色和n单色)-颜色列、打印技术(Laser、Jet、 或Matrix)-类型 …
如何简化下面显示的查询的代码?要求始终与我描述的相同,如下所示:
(select * from questions where points = 3 and type = 1 order by rand() asc limit 6)
union all
(select * from questions where points = 2 and type = 1 order by rand() asc limit 4)
union all
(select * from questions where points = 1 and type = 1 order by rand() asc limit 2)
union all
(select * from questions where points = 3 and type = 0 order by rand() asc limit 10)
union …Run Code Online (Sandbox Code Playgroud) 我有一种感觉,这肯定被问过多次,但我只是找不到解决方案,甚至可能因为难以解释而提出问题。
我们都知道内连接基本上给出了两个表的“交集”。因此多个内连接给出了所有表的交集。但是,我希望获得一个内部连接,该连接获得表 B 与 A或表 C 与 A的交集。
对于获得所有组织的请求,我要么是主持人,要么是管理员。
SELECT *
FROM organization
INNER JOIN moderator_organization
ON organization.id = moderator_organization.organization AND moderator_organization.user = 10
INNER JOIN admin_organization
ON organization.id = admin_organization.organization AND admin_organization.user = 10
Run Code Online (Sandbox Code Playgroud)
然而,上面只会选择用户(ID 为 10)既是管理员又是组织者的组织,而不是其中任何一个都为真的组织。要在图表中可视化,我想:
红色区域是我想要请求的地方。
无论我如何尝试对该查询生成的记录集进行分组,它都不会这样做。查询工作正常,问题是尝试按 A 分组
SELECT CountryCode + + ProductNumber + + StockType AS A,
Quantity AS B,
Description AS C,
Price AS D
FROM dbo.vwSalesInvoiceWHandling
UNION ALL
SELECT CountryCode + + ProductNumber + + StockType AS A,
Quantity AS B,
Description AS C,
Price AS D
FROM dbo.vwSalesInvoiceWOHandling
Run Code Online (Sandbox Code Playgroud) 我一直在试图弄清楚如何配置一个具有 64GB 内存(远大于数据库)的 PostgreSQL 实例,以及我是否应该选择更多内核或更快的内核。(假设通行证总数在 15- 20% 的差异)
一些额外的细节:最密集的 READ 将是通过大量 UNION 的 JSONB。本例中的操作系统是 CentOS 6。
我的查询是:
SELECT BRAND,BRAND_GROUP, SUB_BRAND ,SUM(INCOME) AS TOTAL_INCOME FROM
"tema".MMT WHERE BRAND_GROUP IS NULL AND SUB_BRAND IS NULL GROUP BY
BRAND,BRAND_GROUP,SUB_BRAND
UNION
SELECT BRAND,BRAND_GROUP, SUB_BRAND ,SUM(INCOME) AS TOTAL_INCOME FROM
"tema".BGT WHERE BRAND_GROUP IS NULL AND SUB_BRAND IS NULL GROUP BY
BRAND,BRAND_GROUP,SUB_BRAND;
Run Code Online (Sandbox Code Playgroud)
我的输出是:
BRAND BRAND_GROUP SUB_BRAND TOTAL_INCOME
----- ----------- --------- ------------
GBS NULL NULL 10000
SWG NULL NULL 10000
GBS NULL NULL 20000
STG NULL NULL 20000
GTS NULL NULL 30000
Run Code Online (Sandbox Code Playgroud)
问题是我有 2 类品牌,而我只想拥有 1 类。像这样:
Brand Brand_Group Sub_brand Total_Income
GBS - …Run Code Online (Sandbox Code Playgroud) 我有 2 个查询,我想将它们一起使用以向用户生成一个输出结果。输出向用户描述了从 A 到 B 的旅程。当我尝试将两个查询与UNION以下内容结合时,我不断收到语法错误:
Run Code Online (Sandbox Code Playgroud)Query failed: ERROR: syntax error at or near "UNION" LINE 6: UNION ^
我看过一个类似的问题,但提供的解决方案和讨论似乎不起作用。
$name = pg_escape_string($_POST['name']); // Start destination from user input
$name2 = pg_escape_string($_POST['name2']); // End destination from user input
//If no results are given, the following query below will execute instead.
if (pg_num_rows($result) == 0 ) {
$query = "SELECT dt1.name as name1,dt1.time as time1,dt2.name as name2,dt2.time as time2
From departure_times as dt1
inner join departure_times as dt2 …Run Code Online (Sandbox Code Playgroud) 如您所知,union删除重复的行。我认为它从后者中删除,但事实并非如此。
我发现如果没有order by子句,Oracle 会按第一列对合并的数据集进行排序并删除重复项。
select 4,5,6 from dual
union
select 1,2,3 from dual
union
select 4,5,6 from dual
Run Code Online (Sandbox Code Playgroud)
结果:
1 2 3
4 5 6
Run Code Online (Sandbox Code Playgroud)
而我期望:
4 5 6
1 2 3
Run Code Online (Sandbox Code Playgroud)
我在这方面失败了很多次,并使问题变得简单,就像上面的例子一样。
如何在没有 的情况下保持联合序列order by?
在我的真实案例中,第一个select是完全匹配(=)结果,第二个是部分匹配(like)结果。
例如,如果我搜索罗马人。
全场比赛结果:罗马,部分比赛结果:香气。
当然,完整的比赛结果应该是第一位的。正如我所说,它似乎order by是union结果的第一列。
但是,如您所见:
select 'roma' from dual -- result comes out anyway..
union select 'aroma' from dual; …Run Code Online (Sandbox Code Playgroud) 考虑以下两个查询。
SELECT Col1, Col2
FROM TblA
UNION
SELECT Col1, Col2
FROM TblB
Run Code Online (Sandbox Code Playgroud)
和
SELECT DISTINCT Col1, Col2
FROM TblA
UNION
SELECT DISTINCT Col1, Col2
FROM TblB
Run Code Online (Sandbox Code Playgroud)
这些在逻辑上是等价的。我的问题是数据库引擎是否对它们进行了相同的处理。SQL Server 是否识别冗余并忽略DISTINCT运算符?
SQL 2011 规范支持CORRESPONDING子句,
功能 F301,“
CORRESPONDING在查询表达式中”:
这是什么功能?它是如何使用的?并且,它是否得到任何行业 RDBM 的支持?
下面的查询看似简单明了,但却产生了意想不到的结果。
CREATE TABLE #NUMBERS
(
N BIGINT
);
INSERT INTO #NUMBERS VALUES
(1),
(2),
(3),
(4),
(5),
(6),
(7),
(8),
(9)
;
WITH
A AS
(
-- CHOOSE A ROW AT RANDOM
SELECT TOP 1 *
FROM #NUMBERS
ORDER BY NewID()
),
B AS
(
SELECT A.N AS QUANTITY, 'METERS' AS UNIT FROM A
UNION ALL
SELECT A.N*100 AS QUANTITY, 'CENTIMETERS' AS UNIT FROM A
UNION ALL
SELECT A.N*1000 AS QUANTITY, 'MILLIMETERS' AS UNIT FROM A
UNION ALL
SELECT A.N*1000000 …Run Code Online (Sandbox Code Playgroud) union ×13
sql-server ×6
postgresql ×3
cte ×2
blob ×1
db2 ×1
distinct ×1
exception ×1
join ×1
mysql ×1
oracle ×1
order-by ×1
performance ×1
php ×1
query ×1
select ×1
sql-standard ×1
t-sql ×1