标签: join

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

我有 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
查看次数

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

我有两张桌子,一张是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万
查看次数

MySQL中递归获取最高父id

我想找到每个条目最上面的父 ID。例如,

CREATE TABLE t1
(
ID int(11) unsigned NOT NULL,
ParentID int(11) unsigned,
PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;

INSERT INTO t1 (ID,ParentID) VALUES (1,NULL),(2,1),(3,2),(4,3);
Run Code Online (Sandbox Code Playgroud)

我意图得到

ID     Highest ParentID
1      NULL
2      1
3      1
4      1
Run Code Online (Sandbox Code Playgroud)

我计划创建一个递归查询(MySQL 8 或 MariaDB 10.5),方法是添加一个条件,以在 Parent ID 为特定值(例如,上述情况下为 NULL)时中断递归。我开始于

WITH RECURSIVE cte (ID, ParentID) as (
  SELECT ID,ParentID FROM t1
  UNION ALL
  SELECT t2.ID,t2.ParentID FROM t1 t2
  INNER JOIN cte on t2.ParentID = cte.ID
)
SELECT * FROM cte; …
Run Code Online (Sandbox Code Playgroud)

mysql join query recursive

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

选择 Distinct 和 Inner Join 带来重复的值

我在使用内部联接从两个表中获取唯一值时遇到问题。

\n
SELECT distinct cast (opd.order_number as integer), p.payment_id ,\n    pt.transaction_status, \n    opd.installments_number, \n    pt.amount, \n    pt.origin_amount,\n    p.payment_capture_type,\n    opd.brand,\n    pt.created_date, \n    d."name" \nFROM payment p \nINNER JOIN payment_transaction pt ON pt.payment_id = p.payment_id\ninner join "domain" d on d.domain_id = p.domain_id \nINNER JOIN attempted_online_payment_data opd ON p.payment_id = CAST ( opd.order_number AS INTEGER )\nWHERE \np.created_date >= \'2021-11-01\' and status = 1\n
Run Code Online (Sandbox Code Playgroud)\n

这是我正在使用的查询,我想要一个 payment_id\xc2\xb4s 的唯一值列表,但是当我这样做时,由于某种原因它会带来两个相同的 payment_id。

\n

在此输入图像描述

\n

如何为每个 payment_id 获取唯一的行?

\n

postgresql join query distinct

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

我可以编写不带 OR IS NULL 的 FULL OUTER JOIN 吗?

这里有一些可以使用的数据:

CREATE TABLE a (
    a_id   int  NOT NULL,
    a_prop text NOT NULL
);

CREATE TABLE b (
    b_id   int  NOT NULL,
    b_prop text NOT NULL
);

INSERT INTO a VALUES (1, 'blah'), (2, 'blah'), (4, 'not this one');
INSERT INTO b VALUES (1, 'blah'), (3, 'blah'), (5, 'not this one');
Run Code Online (Sandbox Code Playgroud)

现在我想编写一个返回的查询:

结果

一种可能性是:

SELECT *
FROM a
FULL OUTER JOIN b ON a_id = b_id
WHERE (a_prop = 'blah' OR a_prop IS NULL)
AND (b_prop = 'blah' OR b_prop IS …
Run Code Online (Sandbox Code Playgroud)

postgresql join syntax

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

如何在 SQL Server 中使用 SUM 和 GROUP BY 连接两个表

我有2张桌子

  1. 产品
ID 指定
1 古柯
2 百事可乐
3 芬达
4
5

2)子产品

产品编号 姓名 数量
1 SM 10
1 lg 10
1 XL 20
2 1升 10
2 2升 20
2 5升 20
3 10
3 20
4 20
4 克德 30

我想要的是这样的:产品表中的指定和总数量,代表具有相同product_id的数量的总和

指定 总数(量
古柯 40
百事可乐 50
芬达 30
50

注:我使用 SQL 服务器

join sql-server query group-by sum

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

在 SQL 中使用逗号分隔值连接,表之间没有直接关系

我有一张桌子 [CourseMaster] 喜欢

CourseId    CourseName
-----------------------
  01          ABC
  02          DEF
  03          GHI
  04          JKL
  05          MNO
  06          PQR
  07          STU
Run Code Online (Sandbox Code Playgroud)

我还有另一张表 [StudentMaster] 用于学生详细信息,例如

ROLLNO  NAME    ADDRESS       
------------------------------
12345   RAM     RAM ADDRESS                     
25695   HARI    HARI ADDRESS                   
89685   JEFF    JEFF ADDRESS              
47896   DAISY   DAISY ADDRESS 
Run Code Online (Sandbox Code Playgroud)

我还有另一张表 [StudentCourseMaster] 用于学生课程详细信息,例如

ROLLNO     CourseId      
-------------------
12345      01             
12345      02                 
12345      06            
25695      02
25695      06
89685      03
89685      05
89685      06
89685      07
47896      03
Run Code Online (Sandbox Code Playgroud)

我试图以以下格式获取结果,但无法进行连接。

ROLLNO  NAME    ADDRESS         Course
-------------------------------------------
12345   RAM     RAM ADDRESS     ABC,DEF,PQR …
Run Code Online (Sandbox Code Playgroud)

join sql-server

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

在 DATETIME 列上连接表时优化 SQL Server 查询

我正在使用 SQL Server,我有两个表,table1并且table2. 两个表都有一个DATETIME表示为 的列dt。我不仅需要根据某些条件连接这些表,还要确保匹配的行具有相同的日期(此处不考虑时间)dt

这是我当前使用的查询:

select *
From table1 a inner join table2 b
    on a.id = b.a_id
    and convert(date, a.dt) = convert(date, b.dt)
Run Code Online (Sandbox Code Playgroud)

该查询可以获取我需要的结果,但我担心它的性能,尤其是当表大小增加时。

我想知道是否有更高效的方法可以达到相同的结果?是否有技术或 SQL Server 功能可以帮助我优化此查询,尤其是日期比较部分?

任何意见或建议将不胜感激。先感谢您。

join sql-server datetime date

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

根据多个条件连接两个表

我有两个表产品和职位。

产品:

id BIGINT PRIMARY KEY,
product VARCHAR(100),
criterium1 VARCHAR(100),
criterium2 VARCHAR(100)
Run Code Online (Sandbox Code Playgroud)

职位:

id BIGINT PRIMARY KEY,
position VARCHAR(100),
criterium1 VARCHAR(100),
criterium2 VARCHAR(100)
Run Code Online (Sandbox Code Playgroud)

每个表都有criterium1和criterium2。我想要一个包含职位和产品之间连接的结果集。对于每个职位,我都想要与 criterium1 或 criterium2 匹配的相应产品;当 criterium1 找不到或为 NULL 时,它需要在 criterium2 上匹配。

SQL 语句会是什么样的?

到目前为止,我已经尝试过:

SELECT * FROM positions pos 
INNER JOIN products pro 
ON COALESCE(pos.criterium1, pos.criterium2,'') 
    = COALESCE( pro.criterium1, pro.criterium2,'') 
Run Code Online (Sandbox Code Playgroud)

然而,这不匹配pro.criterium1pos.criterium1pro.criterium2pos.criterium2

补充:对不起,我的要求有点模糊。让我试着完成这幅画。

我们使用的是 SQL Server 2005。

products:

id   product   criterium1   criterium2
 1    pro1       AAA1         910
 2    pro2       106          BB2 …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 join sql-server

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

查询需要数小时

到目前为止,我的 PostgreSQL 应用程序中的所有查询都很快。在过去的几天里,有时一个查询需要几个小时。索引是健康的,因为在 dump、restore、vacuum -z 之后,它仍然是一样的:查询需要几个小时。

EXPLAIN  VERBOSE SELECT DISTINCT "modwork_beleg"."direction" 
FROM "modwork_beleg" 
LEFT OUTER JOIN "modwork_isu_isu_pkunde" ON ("modwork_beleg"."id" = "modwork_isu_isu_pkunde"."beleg_id")
LEFT OUTER JOIN "modwork_isu_isu_vknr"   ON ("modwork_beleg"."id" = "modwork_isu_isu_vknr"."beleg_id")
LEFT OUTER JOIN "modwork_isu_isu_gpnr"   ON ("modwork_beleg"."id" = "modwork_isu_isu_gpnr"."beleg_id")
WHERE ("modwork_beleg"."state" IN (E'neu', E'inarbeit', E'wiedervorlage')
    AND (
      "modwork_isu_isu_pkunde"."pkunde" = 90237758
      OR
      "modwork_isu_isu_vknr"."vknr" = 254400297729
      OR
      "modwork_isu_isu_gpnr"."gpnr" = 1001030921
));
Run Code Online (Sandbox Code Playgroud)

查询计划:

 HashAggregate  (cost=36409.29..36409.30 rows=1 width=3)
   Output: modwork_beleg.direction
   ->  Merge Right Join  (cost=28836.70..36409.29 rows=1 width=3)
         Output: modwork_beleg.direction
         Merge Cond: (modwork_isu_isu_vknr.beleg_id = modwork_beleg.id)
         Filter: ((modwork_isu_isu_pkunde.pkunde …
Run Code Online (Sandbox Code Playgroud)

postgresql performance join

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