标签: subquery

在 values 子句中禁止子查询的原因是什么?

例如

SQL> create table dates(d date);

Table created.

SQL> insert into dates select sysdate from dual;

1 row created.

SQL> select * from dates;

D
---------
28-MAY-11

SQL> insert into dates (d) values (select sysdate fom dual);
insert into dates (d) values (select sysdate fom dual)
                              *
ERROR at line 1:
ORA-00936: missing expression


SQL>
Run Code Online (Sandbox Code Playgroud)

oracle subquery database-internals

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

如何使用 MySQL 从不确定数量的表中选择使用相同的字段?

我正在处理一个 MySQL 数据库,其中有数量不确定的相同结构的表,如下所示:

foo_reference1
foo_reference2
foo_referencea
foo_referenceb
....
foo_referencez
Run Code Online (Sandbox Code Playgroud)

该表中的所有包含的字段foo_idbar_id以及bar_weight。我需要获取bar_idbar_weight(降序)排序的前五个字段,其中foo_id等于每个表中的某个值。

问题是,没有两台服务器会拥有完全相同数量的表或相同的名称。但是,它们总是以foo_reference. 我需要在几十个地方运行它。在理想的世界中,只会有一个正确索引的foo_reference表,不幸的是,更改是不可能的。

最初,我尝试仅SHOW TABLES LIKE 'foo_reference%'在子查询中使用以构建必须查询的表列表。显然,MySQL不喜欢这样,所以我直接查询了信息模式:

select bar_id, bar_weight from
(
    select table_name as name
    from information_schema.tables as tmp
    where tmp.table_name like 'foo_reference%'
) as res
where res.foo_id = '1'
order by res.bar_weight desc
limit 0, 5;
Run Code Online (Sandbox Code Playgroud)

MySQL 告诉我这bar_id是字段列表中的未知列。当我自己运行子查询时,它返回需要查询的表列表。

我做错了什么?我想要的是bar_id每个表中的前 5 个字段,其中foo_id是某个数字。正如您所看到的,当我来到这里时,我正在做一些学习(以及很多猜测)。

mysql myisam subquery information-schema

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

MySQL:删除除最后 N 条记录以外的所有记录

考虑下表:

mysql> DESCRIBE pixels;
+---------------+-------------+------+-----+-------------------+----------------+
| Field         | Type        | Null | Key | Default           | Extra          |
+---------------+-------------+------+-----+-------------------+----------------+
| id            | bigint(20)  | NO   | PRI | NULL              | auto_increment |
| pixel_id      | varchar(32) | NO   | MUL | NULL              |                |
| creation_time | timestamp   | NO   | MUL | CURRENT_TIMESTAMP |                |
| pixel         | mediumblob  | NO   |     | NULL              |                |
+---------------+-------------+------+-----+-------------------+----------------+
4 rows in set (0.04 sec)
Run Code Online (Sandbox Code Playgroud)

用一些数据:

mysql> SELECT * FROM pixels; …
Run Code Online (Sandbox Code Playgroud)

mysql delete subquery

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

子查询会拉取整个表吗?

我正在尝试在表中运行子查询:

SELECT t1.*, t2.* FROM t1 
LEFT JOIN (SELECT * FROM table2 GROUP BY col1) AS t2 on t1.col1 = t2.col1
WHERE ...
Run Code Online (Sandbox Code Playgroud)

我的主要问题是,由于它自己调用的子查询会拉整个时间,它是否也在子查询中拉整个时间,即使父查询上的 WHERE 条件只拉几行实际数据库?

我想我可以将 where 查询放在子查询中,但它是一个非常复杂的 where 查询,涉及其他表。

subquery

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

子选择需要“年龄” - EXCEPT要快得多

创建表的脚本

DROP TABLE IF EXISTS history;
CREATE TABLE history (
    id integer NOT NULL,
    ticket_id integer NOT NULL);
ALTER TABLE ONLY history ADD CONSTRAINT history_pkey PRIMARY KEY (id);
CREATE INDEX history_ticket_id ON history USING btree (ticket_id);
DROP TABLE IF EXISTS ticket;
CREATE TABLE ticket (
    id integer NOT NULL
);
ALTER TABLE ONLY ticket ADD CONSTRAINT ticket_pkey PRIMARY KEY (id);
Run Code Online (Sandbox Code Playgroud)

虚拟数据

INSERT INTO history values (generate_series(1, 30000), generate_series(1, 30000));
ANALYZE history;

INSERT INTO ticket values (generate_series(1, 40000));
ANALYZE ticket;
Run Code Online (Sandbox Code Playgroud)

使用子选择查询 …

performance subquery postgresql-9.3 except postgresql-performance

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

为什么将 ROWNUM 添加到查询会提高性能?

我有两个疑问:

1)此查询有一个 ROWNUM 列(执行需要 20 秒):

SELECT
     ROWNUM
     ,ROAD_ID
     ,VERTEX_INDEX
     ,SDE.ST_X(ST_POINT) AS X
     ,SDE.ST_Y(ST_POINT) AS Y
FROM
(
     SELECT  
           ROWNUM
           ,a.ROAD_ID
           ,b.NUMBERS VERTEX_INDEX
           ,SDE.ST_PointN(a.SHAPE, b.NUMBERS) AS ST_POINT
     FROM  ENG.ROAD a
           CROSS JOIN ENG.NUMBERS b
     WHERE b.NUMBERS <= SDE.ST_NUMPOINTS(a.SHAPE)
)
--removed to do explain plan: ORDER BY ROAD_ID, VERTEX_INDEX

-------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name                 | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                      |  5996 |   322K|       |   262   (1)| 00:00:01 …
Run Code Online (Sandbox Code Playgroud)

performance oracle subquery query-performance

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

如何在不使用 DISTINCT 的情况下识别无法重写为 JOIN 的相关子查询?

我对 SQL 查询调优相当陌生。我一直在尝试了解如何编写等效的查询。在浏览J. Widom 教授的斯坦福在线视频讲座时,她提到了一些子查询,如果不JOIN使用DISTINCT. 例如,看这个:

  1. 4:45 / 20:13 - GPA 示例

    SELECT GPA
    FROM Student
    WHERE sID in (select sID from Apply where major = 'CS');
    
    Run Code Online (Sandbox Code Playgroud)
  2. 6:39 / 20:13 - 学生申请 CS 而不是 EE

    SELECT sID, sName
    FROM Student
    WHERE sID IN (select sID from Apply where major = 'CS')
      AND sID NOT IN (select sID from Apply where major = 'EE');
    
    Run Code Online (Sandbox Code Playgroud)

我的问题是如何知道使用子查询编写的 SQL 语句是否将具有使用连接编写的等效语句。我很舒服,如果在答案中,有人喜欢使用关系代数表示法。

我在网上搜索了很多,找不到合适的答案。

样本数据

Schema 和表创建(对于 PostgreSQL)如下,

CREATE TEMP TABLE college …
Run Code Online (Sandbox Code Playgroud)

join subquery

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

子查询中 count(*) 的性能

假设我们有以下查询:

1.

    SELECT COUNT(*) FROM some_big_table WHERE some_col = 'some_val'
Run Code Online (Sandbox Code Playgroud)

2.

    SELECT COUNT(*) FROM ( SELECT * FROM some_big_table WHERE some_col = 'some_val' )
Run Code Online (Sandbox Code Playgroud)

之前的任何查询是否性能更好?或者他们是一样的?

我使用的是 Postgresql 9.4,但是与其他 DBMS 有很大不同吗?

PS:我问这个问题是因为 SQLAlchemy 是一个基于 Python 的 ORM,COUNT它默认在子查询上执行操作,但有一个选项可以强制它COUNT直接在查询上执行。

postgresql performance subquery postgresql-9.4 sqlalchemy query-performance

5
推荐指数
3
解决办法
8679
查看次数

如何从一个表中获取所有记录并查看它们是否在没有子查询的情况下在另一个表中使用

我正在尝试编写一个 SQL 语句,从一个表中提取所有记录并查看它们是否在另一个表中使用。SQL 不是我最擅长的语言,所以我确信这是一个非常简单的查询。这是我的两个表:

tblOrderContracts
--------------------------------------
OrderContractID           | bigint
OrderID                   | bigint
UserContractID            | bigint
UserName                  | varchar
OrderContractDateCreated  | datetime
OrderContractStatus       | varchar



tblUserContracts
-------------------------------------
UserContractId            | bigint
UserName                  | varchar
UserContractName          | varchar
UserContractFileName      | varchar
UserContractDateCreated   | datetime
UserContractStatus        | varchar
Run Code Online (Sandbox Code Playgroud)

用户可以将任意数量的合约应用到一个订单,所以我需要做的是获取所有合约的列表,并查看它们是否按特定顺序使用。现在,我使用子查询来完成工作,但如果不需要,我不喜欢使用子查询。

SELECT uc.UserContractId, uc.UserContractName,
(SELECT oc.OrderID FROM tblOrderContracts as oc WHERE uc.UserContractID = 
oc.UserContractID AND oc.OrderID = 466 AND OrderContractStatus = 
'Active')
FROM tblUserContracts as uc
WHERE uc.UserName = 'vandel212' AND UserContractStatus = 'Active'
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望得到一个如下所示的结果集,如果 OrderID …

optimization subquery

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

编写此查询的更好方法是什么?

我的数据库(Postgresql 10)具有以下架构:

CREATE TABLE "PulledTexts" (
"Id" serial PRIMARY KEY,
"BaseText" TEXT,
"CleanText" TEXT
);

CREATE TABLE "UniqueWords" (
"Id" serial PRIMARY KEY,
"WordText" TEXT
);

CREATE TABLE "WordTexts" (
"Id" serial PRIMARY KEY,
"TextIdId" INTEGER REFERENCES "PulledTexts",
"WordIdId" INTEGER REFERENCES "UniqueWords"
);
CREATE INDEX "IX_WordTexts_TextIdId" ON "WordTexts" ("TextIdId");
CREATE INDEX "IX_WordTexts_WordIdId" ON "WordTexts" ("WordIdId");
Run Code Online (Sandbox Code Playgroud)

一些示例数据:

INSERT INTO public."PulledTexts" ("Id", "BaseText", "CleanText") VALUES
(1, 'automate business audit', null),
(2, 'audit trial', null),
(3, 'trial', null),
(4, 'audit', null),
(5, 'fresh …
Run Code Online (Sandbox Code Playgroud)

postgresql performance subquery relational-division postgresql-performance

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