标签: subquery

按另一个表的 COUNT 更新列

这可能是一个幼稚的问题,但这两个查询有什么区别,哪个是首选?

UPDATE table1, 
(SELECT id,COUNT(*) idcount FROM table2 GROUP BY id) AS B 
SET table1.Freq = B.idcount WHERE table1.id=B.id
Run Code Online (Sandbox Code Playgroud)

UPDATE table1 A INNER JOIN 
(SELECT id,COUNT(*) idcount FROM table2 GROUP BY id) B USING (id) 
SET A.Freq = B.idcount
Run Code Online (Sandbox Code Playgroud)

mysql performance join subquery update query-performance

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

为什么 COALESCE 函数对此查询不起作用?

我正在尝试计算从子查询中检索的列数,并且某些子查询可能为空。因此,我不想将其显示为空单元格,而是希望它为 0。发现我可以通过使用该COALESCE函数来做到这一点,但例如此查询仍然给我一个空单元格:

CREATE VIEW third_table AS 
SELECT * 
FROM  (second_table  
NATURAL FULL JOIN (
   SELECT assignment_id, COALESCE( count(*), 0 ) AS num_60_79 
   FROM (
      SELECT assignment_id, mark_as_percent 
      FROM avg_required_table
      WHERE mark_as_percent >= 60 
      AND mark_as_percent < 80
      ) a 
   GROUP BY assignment_id
   ) b);
Run Code Online (Sandbox Code Playgroud)

这是COALESCE应该如何使用?

postgresql join subquery coalesce

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

过滤无效记录后,在带有 WHERE 子句的 SUBQUERY 中将 NVARCHAR 转换为 BIGINT 时出错

我有一个表,其中的 NVARCHAR 列包含无法转换为 BIGINT 的数据。我很清楚这一点,并已使用 过滤掉它ISNUMERIC(BB.NVARCHARCOL) = 1。尽管如此,在尝试查询数据时我仍然收到错误,说明Error converting data type nvarchar to bigint.

以下工作正常(SQL 没有报告错误):

SELECT *
FROM myNormalTable AA INNER JOIN myBadTable BB ON BB.NVARCHARCOL = AA.MYBIGINTCOL
WHERE ISNUMERIC(BB.NVARCHARCOL) = 1
Run Code Online (Sandbox Code Playgroud)

以下抛出错误:

SELECT *
FROM (
    SELECT *
    FROM myNormalTable AA INNER JOIN myBadTable BB ON BB.NVARCHARCOL = AA.MYBIGINTCOL
    WHERE ISNUMERIC(BB.NVARCHARCOL) = 1
    ) ZZ 
WHERE ZZ.MYBIGINTCOL = 1234
Run Code Online (Sandbox Code Playgroud)

这种变化也会引发错误:

SELECT *
FROM (
    SELECT *
    FROM myNormalTable AA INNER JOIN
        (SELECT CAST(NVARCHARCOL AS BIGINT) …
Run Code Online (Sandbox Code Playgroud)

sql-server subquery cast

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

如何避免 FILTER 子句中的子查询?

架构

  CREATE TABLE "applications" (
  "id"             SERIAL                   NOT NULL PRIMARY KEY,
  "country"        VARCHAR(2)               NOT NULL,
  "created"        TIMESTAMP WITH TIME ZONE NOT NULL,
  "is_preliminary" BOOLEAN                  NOT NULL,
  "first_name"     VARCHAR(128)             NOT NULL,
  "last_name"      VARCHAR(128)             NOT NULL,
  "birth_number"   VARCHAR(11)              NULL
);

CREATE TABLE "persons" (
  "id"       UUID                     NOT NULL PRIMARY KEY,
  "created"  TIMESTAMP WITH TIME ZONE NOT NULL,
  "modified" TIMESTAMP WITH TIME ZONE NOT NULL
);

ALTER TABLE "applications" ADD COLUMN "physical_person_id" UUID NULL;
CREATE INDEX "physical_person_id_idx" ON "applications" ("physical_person_id");

ALTER TABLE …
Run Code Online (Sandbox Code Playgroud)

postgresql performance subquery

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

在同一查询中重用相关子查询的结果

我有 4 张桌子(实际上我还有很多想要做的事情......但这就是我开始的地方)。

  • distr_catalogs: 有很多distr_catalog_brandsdistr_catalog_system_types
  • distr_catalog_brands: 属于distr_catalogs
  • distr_catalog_system_types: 属于distr_catalogs
  • brand_catalog_sections: 属于distr_catalog_brandsdistr_catalog_system_types

我想创建一个物化视图,其列是:

catalog_id | catalog_name | brand_ids | system_type_ids | catalog_sections
Run Code Online (Sandbox Code Playgroud)
  • catalog_id&catalog_name从桌子上distr_catalog
  • brand_ids包含与目录相关的品牌 ID 数组
  • system_type_ids保存与目录相关的系统类型 ID 的数组
  • catalog_sectionsbrand_ids包含与和相关的品牌目录部分 ID 的数组system_type_ids

除了最后一个之外,我可以做所有的事情:

CREATE MATERIALIZED VIEW catalog_system_brands AS
select dc.id as catalog_id, dc.catalog_name, 
ARRAY(SELECT brand_id FROM distr_catalog_brands WHERE distr_catalog_id = dc.id) as brands,
ARRAY(SELECT id FROM distr_catalog_system_types WHERE display_status …
Run Code Online (Sandbox Code Playgroud)

postgresql join subquery

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

如果没有 B 则查询 A

我有一个包含列ID, TYPE, DATE, ... 的表,我需要所有数据集TYPE <> 'A'(案例 1),TYPE = A如果没有TYPE = B相同的数据集ID(案例 2)。第一种情况很容易,所以我想UNION用来结合第一种和第二种情况。但我不知道如何选择第二种情况。我正在尝试自我连接,例如:

SELECT *
FROM MY_TABLE TAB1
JOIN MY_TABLE TAB2
ON
  TAB1.ID = TAB2.ID
  AND TAB1.TYPE = 'A'
  AND TAB2.TYPE = 'B'
Run Code Online (Sandbox Code Playgroud)

这样我就得到了我不想要的集合。我想我需要一个子查询,但我不知道我应该朝哪个方向工作。

也许是这样的:

SELECT *
FROM MY_TABLE TAB1
WHERE TAB1.TYPE <>'A'
UNION
SELECT *
FROM MY_TABLE TAB1
NOT IN
(SELECT *
FROM MY_TABLE TAB1
JOIN MY_TABLE TAB2
ON
  TAB1.ID = TAB2.ID
  AND TAB1.TYPE = …
Run Code Online (Sandbox Code Playgroud)

db2 subquery

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

我对子查询做错了什么

我无法解决这个问题,如何让子查询为每个讲师返回最低的课程权重,它目前只返回最低的,我的子查询是错误的还是外部查询?

问题:显示每位讲师的最低课程作业权重,显示员工 ID、模块 ID 和所选的权重。

SELECT m1.ModuleID, m1.CWWeight, l.StaffID
FROM dbo.module as m1
INNER JOIN dbo.Lecturer as l
    ON m1.ModuleConvenor = l.StaffID
WHERE m1.CWWeight = (SELECT MIN(m2.CWWeight)
                    FROM dbo.Module as m2)
Run Code Online (Sandbox Code Playgroud)

sql-server subquery sql-server-2014

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

限制多行的左连接

由于 MySql 不支持子查询中的主别名引用,因此创建具有多行的查询有点困难,您必须限制左连接表的行。

让我们概述一下简单的例子。

假设有两个表:

CREATE TABLE `items` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `parent` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
  PRIMARY KEY (`id`));

CREATE TABLE `sub_items` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `child` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
  `parent_id` INT NOT NULL,
  PRIMARY KEY (`id`));
Run Code Online (Sandbox Code Playgroud)

内容如下:

INSERT INTO `items` (`parent`) VALUES ('Main item1');
INSERT INTO `items` (`parent`) VALUES ('Main item2');
INSERT INTO `items` (`parent`) VALUES ('Main item3');

INSERT INTO `sub_items` (`child`, `parent_id`) VALUES ('Child …
Run Code Online (Sandbox Code Playgroud)

mysql subquery limits mysql-5.6 greatest-n-per-group

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

子查询可以生成与 CTE 不同的执行计划吗?

我正在与老板交谈,他更喜欢子查询而不是 CTE。就个人而言,我讨厌子查询。他提到子查询可以更快,但我不相信。我运行了这个简短的测试:

    with classes as 
    (select top 10 Classkey from dimclass
    group by classkey
    order by count(1) desc),
    policies as (
    select CarrierKey, policykey, periodeffectivedate from dimpolicy),
    exposure as (
    select policykey, classkey  from DimExposure)


    select * from policies p
    inner join exposure x on p.PolicyKey = x.PolicyKey
    inner join classes c on x.ClassKey = c.Classkey
Run Code Online (Sandbox Code Playgroud)

有一个执行计划:

https://www.brentozar.com/pastetheplan/?id=SJYJUZNHS

    select p.CarrierKey, p.PolicyKey, p.periodeffectivedate from dimpolicy p
    inner join (select policykey, classkey  from DimExposure) x on p.PolicyKey = x.PolicyKey
    inner join (select …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server cte subquery

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

错误:子查询必须仅返回一列

我有两张桌子,一张是Category,另一张是Product

表说明有

类别

  • 姓名
  • 描述
  • Parent_id(自引用键)(最多可达 3 级)

产品

  • 姓名
  • 描述
  • 类型
  • category_id(类别表的外键)

    我想在单个产品上显示所有类别以及相关产品。因此,为了获取关联的类别,我使用以下查询。我可以在自引用表中进行左连接,但无法获取产品数据列表,因为这是一个子查询,而子查询只会返回单个列。

        select                                                                                                                                                                                                      
                   cat1.id, ARRAY(select name, type, description from product where
                   product.category_id = cat1.id)
                   as category_1_products_data,
    
                   cat2.id, ARRAY(select name, type, description from product where
                   product.category_id = cat2.id)
                   as category_2_products_data,
    
                   cat3.id, ARRAY(select name, type, description from product where
                   product.category_id = cat3.id)
                   as category_3_products_data
        from       category cat1
        left join  category cat2
        on         cat2.parent_id = cat1.id
        left join  category cat3
        on         cat3.parent_id = cat2.id
        where      cat1.parent_id is …
    Run Code Online (Sandbox Code Playgroud)

postgresql join subquery select

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