我有 4 张桌子(实际上我还有很多想要做的事情......但这就是我开始的地方)。
distr_catalogs: 有很多distr_catalog_brands,distr_catalog_system_typesdistr_catalog_brands: 属于distr_catalogsdistr_catalog_system_types: 属于distr_catalogsbrand_catalog_sections: 属于distr_catalog_brands,distr_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) 我有两张桌子,一张是Category,另一张是Product。
表说明有
类别
产品
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)我想找到每个条目最上面的父 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) 我在使用内部联接从两个表中获取唯一值时遇到问题。
\nSELECT 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\nRun Code Online (Sandbox Code Playgroud)\n这是我正在使用的查询,我想要一个 payment_id\xc2\xb4s 的唯一值列表,但是当我这样做时,由于某种原因它会带来两个相同的 payment_id。
\n\n如何为每个 payment_id 获取唯一的行?
\n这里有一些可以使用的数据:
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) 我有2张桌子
| 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 服务器
我有一张桌子 [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) 我正在使用 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 功能可以帮助我优化此查询,尤其是日期比较部分?
任何意见或建议将不胜感激。先感谢您。
我有两个表产品和职位。
产品:
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.criterium1到pos.criterium1或pro.criterium2到pos.criterium2。
补充:对不起,我的要求有点模糊。让我试着完成这幅画。
我们使用的是 SQL Server 2005。
products:
id product criterium1 criterium2
1 pro1 AAA1 910
2 pro2 106 BB2 …Run Code Online (Sandbox Code Playgroud) 到目前为止,我的 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) join ×10
postgresql ×5
sql-server ×4
query ×3
subquery ×2
date ×1
datetime ×1
distinct ×1
group-by ×1
mysql ×1
performance ×1
recursive ×1
select ×1
sum ×1
syntax ×1