我尝试将 3 个表(产品、价格、类别)连接在一起,以从连接的表中获取最新和最低价格的结果。
我能够在 MySQL 5.5 上获得预期结果,但升级到 5.6 后,ORDER BY子查询似乎被忽略了。如何更改查询以使其工作ORDER BY?
该查询应该是:
3张表的关系如下:
表信息:
mysql> show columns from products;
+----------------+------------------+------+-----+---------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------------+------+-----+---------------------+-----------------------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(300) | NO …Run Code Online (Sandbox Code Playgroud) mysql performance order-by subquery mysql-5.6 query-performance
我有一个 1:m 协会。
symbols表中有很多行company_key_statistics。company_key_statistics有一个时间戳列createdAt,指示行的创建时间。我需要加入最新symbols的company_key_statistics,但我只需要最新的company_key_statistics。例如,我需要获取ORCL并且MSFT symbols仅获取他们最新的company_key_statistics.
到目前为止我已经尝试过了。
SELECT `symbols`.`id`,
`symbols`.`symbol`,
`statistics`.
`marketCapitalization`
FROM `symbols`
LEFT JOIN (SELECT `s`.`companyId`,
`s`.`marketCapitalization`
FROM `company_key_statistics` AS `s`
WHERE `s`.`companyId` = `symbols`.`id`
ORDER by `createdAt`
DESC LIMIT 1) AS `statistics`
ON `symbols`.`id` = `statistics`.`companyId`
WHERE `symbols`.`symbol` IN ('ORCL', 'SNAP');
Run Code Online (Sandbox Code Playgroud)
但不幸的是我发现我不能在子查询中使用父查询中的列JOIN。
我怎样才能做到这一点?
我有一个 PostgreSQL 数据库,其中有很多相同结构的表,总共 36 列:
CREATE TABLE some_schema.some_table (
id integer NOT NULL DEFAULT nextval('some_schema.id_seq'::regclass),
col2,
col3,
col4,
[...],
col35,
mi_prinx integer NOT NULL DEFAULT nextval('some_schema.mi_prinx_seq'::regclass),
CONSTRAINT some_table_pkey PRIMARY KEY (mi_prinx)
)
Run Code Online (Sandbox Code Playgroud)
在许多情况下,我必须从具有相同结构的另一个表中插入记录:
INSERT INTO some_schema.some_table (col2,col3...col35)
SELECT col2,col3...col35
FROM some_schema.another_table_with_same_structure;
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以做到这一点,而不必列出所有没有默认值的列?我想我可以以某种方式使用,但我无法根据文档DEFAULT VALUES获得正确的语法。
SELECT users.*,(SELECT COUNT(user_id) AS mutual_connection FROM
(SELECT user_id
FROM (
SELECT sender_id AS user_id
FROM `connections`
WHERE receiver_id=users.id AND status='2'
UNION
SELECT receiver_id AS user_id
FROM `connections`
WHERE sender_id=users.id AND status='2'
) tempUser
WHERE user_id IN (
SELECT sender_id AS user_id
FROM `connections`
WHERE receiver_id='4' AND status='2'
UNION
SELECT receiver_id AS user_id
FROM `connections` WHERE sender_id='4' AND status='2')
GROUP BY user_id)
as mutualConnection)
FROM users
Run Code Online (Sandbox Code Playgroud)
错误:
#1054 - 'where 子句'中的未知列'users.id'
如何使用传递值进行子查询
我正在使用 PostgreSQL 11。我想有条件地将值插入表中,同时插入的结果包括null未导致插入的输入的每一行。
例如
CREATE TABLE all_sums (sum INTEGER);
SELECT
CASE WHEN a_sum IS NULL THEN null
ELSE (SELECT sum FROM (INSERT INTO sums (sum) VALUES (sum) RETURNING sum))
END
FROM
(SELECT a + b FROM (VALUES (1, null), (null, 2), (2, 3)) AS row (a, b))
AS a_sum;
Run Code Online (Sandbox Code Playgroud)
应该导致表格all_sums看起来像:
all_sums: sum
------
5
(1 row)
Run Code Online (Sandbox Code Playgroud)
但查询的输出应该是:
null
null
5
------
(3 rows)
Run Code Online (Sandbox Code Playgroud)
此示例因语法错误而失败:
ERROR: syntax error at or near "INTO"
Run Code Online (Sandbox Code Playgroud)
有什么方法可以实现所需的查询输出?
(对于上下文:我这样做的原因是因为还有进一步的查询依赖于知道插入是否发生在特定行上。
这是通过将我的查询从每行一个转换为每列一个来更有效地从文件中插入一些数据的努力的一部分。不过,我不是在寻找其他提高插入速度的技巧,如果不可能,我很高兴在这一点上结束。)
在 Postgres 12 中,我有一张桌子purchase_orders和一张桌子items。我正在运行一个查询,该查询返回给定的 POshop和每个 PO 上订购的项目的总和:
SELECT po.id,
SUM(grouped_items.total_quantity) AS total_quantity
FROM purchase_orders po
LEFT JOIN (
SELECT purchase_order_id,
SUM(quantity) AS total_quantity
FROM items
GROUP BY purchase_order_id
) grouped_items ON po.id = grouped_items.purchase_order_id
WHERE po.shop_id = 195
GROUP BY po.id
Run Code Online (Sandbox Code Playgroud)
此查询返回所需的结果。JOIN 在一个子查询中,因为会有其他 JOINS 到其他表,所以这会生成一个已经分组的表来连接。
我用相关 SELECT子查询而不是 JOIN编写了另一个查询。运行这两种方法的执行时间几乎相同,因此很难看出哪个更快。我跑了,EXPLAIN ANALYZE但不能很好地解释它。
问题:在上面的例子中,Postgres 会处理items子查询的整个表,并且只有在与purchase_orders? 或者它是否足够聪明来过滤集合,如果items首先?
该EXPLAIN报告提到了“Seq Scan on Items...”,它似乎包含 中的所有行items,然后随着它向上移动树而减少。但不确定这是否意味着它实际上 …
我有以下 SQL Server 查询
select
(select top 1 b2 from BB b where b.b1 = a.a1 order by b2) calc,
a1,
a2
from AA a
where a2 = 2;
Run Code Online (Sandbox Code Playgroud)
我可以使用解析函数重写
select
(select b2 from
(select
row_number() over (order by b2) lfd,
b2 from BB b where b.b1 = a.a1
) as t where lfd = 1
) calc,
a1,
a2
from AA a
where a2 = 2;
Run Code Online (Sandbox Code Playgroud)
但是当我将其转换为 oracle 时
create table AA ( a1 NUMBER(10), a2 NUMBER(10) );
insert …Run Code Online (Sandbox Code Playgroud) 我有这个表结构和数据:
CREATE TABLE IF NOT EXISTS `default_relations_users` (
`id_user_rq` int(11) NOT NULL,
`id_user_ap` int(11) NOT NULL,
UNIQUE KEY `rusers_rq_ap_idx` (`id_user_rq`,`id_user_ap`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `default_relations_users` (`id_user_rq`, `id_user_ap`) VALUES
(1, 2),
(1, 3),
(1, 4),
(2, 1),
(2, 2),
(2, 3);
Run Code Online (Sandbox Code Playgroud)
我只需要获取值在左侧但不在右侧的行,例如:将不会选择 1,2 和 2,1 但 1,3 和 1,4 是。我试试这个查询:
SELECT * FROM default_relations_users
WHERE default_relations_users.id_user_rq = 1
AND NOT EXISTS (SELECT id_user_ap FROM default_relations_users WHERE id_user_ap = 1)
Run Code Online (Sandbox Code Playgroud)
也许我不明白子查询是什么意思,或者我以错误的方式使用。所以有什么帮助吗?
服务器 A 和服务器 B 具有相同的硬件和实例配置(A 是生产,B 是 QA)。B 的数据库是从一周前 A 的备份中恢复的。开发团队向我提供了这个查询。
SELECT
c.Start
,c.[End]
,c.Word
,doc.UniqueDocumentNumber
,doc.EID
,c.CUI
,c.Concept
,a.OID
,doc.DocumentTypeName
,doc.ActivityDtTm
,CAST(doc.DocumentTypeId AS INT) AS MedCode
,CASE WHEN c.[Count] = 0 THEN CAST(0.00 AS REAL)
ELSE CAST(LOG(c.TotalCount / c.[Count]) AS REAL) END AS 'idf'
,c.[Count]
,c.TotalCount
FROM ECHO..AEID201 a
INNER JOIN ALPHA..XADocuments doc (NOLOCK) ON a.EID = doc.EID
CROSS APPLY (SELECT t.start,t.[end],t.word,t.cui,t.eid,
t.UniqueDocumentNumber,cu.[Count],cc.TotalCount,core.Concept
FROM HOTEL.dbo.Htf_Index AS t
INNER JOIN HOTEL..Doc_CUI_Counter AS cu ON cu.CUI=t.CUI AND cu.DocumentTypeID=t.DocumentTypeID
INNER JOIN HOTEL..Doc_Counter …Run Code Online (Sandbox Code Playgroud) execution-plan sql-server-2008-r2 subquery functions cross-apply
如果我这样做——
SELECT dv.Name
,MAX(hb.[DateEntered]) as DE
FROM
[Devices] as dv
INNER JOIN
[Heartbeats] as hb ON hb.DeviceID = dv.ID
WHERE DE < '2013-03-04'
GROUP BY dv.Name
Run Code Online (Sandbox Code Playgroud)
我收到这个错误——
消息 207,级别 16,状态 1,第 17 行 列名“DE”无效。
如果我这样做——
SELECT Name, DE FROM (
SELECT dv.Name
,MAX(hb.[DateEntered]) as DE
FROM
[Devices] as dv
INNER JOIN
[Heartbeats] as hb ON hb.DeviceID = dv.ID
GROUP BY dv.Name
) as tmp WHERE tmp.DE < '2013-03-04'
Run Code Online (Sandbox Code Playgroud)
它按预期工作。
有人可以解释为什么我需要将主查询嵌套为子查询来限制我的数据集吗?
另外,这里是否有更好的方法来实现目标?从一张表中检索所有记录,以及按[DateEntered]降序排列的单个“顶部”相关记录?
subquery ×10
mysql ×4
postgresql ×3
insert ×2
join ×2
case ×1
cross-apply ×1
functions ×1
limits ×1
mysql-5.6 ×1
oracle ×1
order-by ×1
performance ×1
query ×1
sql-server ×1
t-sql ×1