AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 318747
Accepted
omerix
omerix
Asked: 2022-10-26 23:29:26 +0800 CST2022-10-26 23:29:26 +0800 CST 2022-10-26 23:29:26 +0800 CST

将 2 个选择子句转换为 1 个选择

  • 772

我正在“材料”表中创建一个“bom”列表条目。

我将为产品组定义的材料带到网格中,以便用户不会忘记相关材料。

用户通过此模板定义。

但如果他们愿意,他们会添加额外的材料(组模板除外)。

如果第二条select语句中有记录;我不想在 1 条选择语句中显示记录。

我从 lvl 列中了解到,该记录应该在第二个 select 子句中被粉碎。(已对编号为 2 的模板进行了定义)

在此处输入图像描述

CREATE TABLE [dbo].[materials](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [productCode] [varchar](50) NULL,
    [description] [varchar](250) NULL,
    [usageQauntity] [float] NULL,
    [process] [varchar](50) NULL,
    [vendor] [varchar](50) NULL,
    [lvl] [int] NULL,
 CONSTRAINT [PK_materials] PRIMARY KEY CLUSTERED 
(
    [id] ASC
) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[product](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [code] [varchar](50) NULL,
    [name] [varchar](250) NULL,
    [groupCode] [varchar](50) NULL,
    [unit] [varchar](10) NULL,
    [price] [float] NULL,
    [minStock] [int] NULL,
    [maxStock] [int] NULL,
 CONSTRAINT [PK_product] PRIMARY KEY CLUSTERED 
(
    [id] ASC
) ON [PRIMARY]
) ON [PRIMARY]

SET IDENTITY_INSERT [dbo].[materials] ON 
INSERT [dbo].[materials] ([id], [productCode], [description], [usageQauntity], [process], [vendor], [lvl]) VALUES (1, N'pencil', N'paint chemical', 0.15, N'1', N'ABC', 1)
INSERT [dbo].[materials] ([id], [productCode], [description], [usageQauntity], [process], [vendor], [lvl]) VALUES (2, N'pencil', N'pen inside', 1, N'1', N'DEF', 2)
INSERT [dbo].[materials] ([id], [productCode], [description], [usageQauntity], [process], [vendor], [lvl]) VALUES (4, N'pencil', N'cover', 1, N'2', N'GHD', 3)
INSERT [dbo].[materials] ([id], [productCode], [description], [usageQauntity], [process], [vendor], [lvl]) VALUES (5, N'pencil', N'brand label', 1, N'0', N'ABC', 4)
INSERT [dbo].[materials] ([id], [productCode], [description], [usageQauntity], [process], [vendor], [lvl]) VALUES (6, N'lp', N'top eraser', 1, N'0', N'', 0)
INSERT [dbo].[materials] ([id], [productCode], [description], [usageQauntity], [process], [vendor], [lvl]) VALUES (7, N'lp', N'DEF brand pencil inside', 1, N'1', N'DEF', 2)
INSERT [dbo].[materials] ([id], [productCode], [description], [usageQauntity], [process], [vendor], [lvl]) VALUES (8, N'eraser', N'chemical', 1, N'0', N'ABC', 4)
INSERT [dbo].[materials] ([id], [productCode], [description], [usageQauntity], [process], [vendor], [lvl]) VALUES (9, N'eraser', N'brand label', 1, N'0', N'ABC', 4)
SET IDENTITY_INSERT [dbo].[materials] OFF

SET IDENTITY_INSERT [dbo].[product] ON 
INSERT [dbo].[product] ([id], [code], [name], [groupCode], [unit], [price], [minStock], [maxStock]) VALUES (1, N'lp', N'lead pencil', N'pencil', N'piece', 15, 1000, 2000)
INSERT [dbo].[product] ([id], [code], [name], [groupCode], [unit], [price], [minStock], [maxStock]) VALUES (2, N'bp', N'ball-point pen', N'pencil', N'piece', 25, 2000, 3000)
INSERT [dbo].[product] ([id], [code], [name], [groupCode], [unit], [price], [minStock], [maxStock]) VALUES (3, N'sp', N'stylographic pen', N'pencil', N'piece', 50, 1000, 2000)
INSERT [dbo].[product] ([id], [code], [name], [groupCode], [unit], [price], [minStock], [maxStock]) VALUES (4, N'me', N'Magnetic eraser', N'eraser', N'piece', 30, 1000, 1500)
INSERT [dbo].[product] ([id], [code], [name], [groupCode], [unit], [price], [minStock], [maxStock]) VALUES (5, N'se', N'Soft Eraser', N'eraser', N'piece', 20, 1000, 2000)
SET IDENTITY_INSERT [dbo].[product] OFF


13 rows affected
select * from product
select * from materials
ID 代码 姓名 组码 单元 价格 最小库存 最大库存
1 LP 铅笔 铅笔 片 15 1000 2000
2 bp 圆珠笔 铅笔 片 25 2000 3000
3 sp 字体笔 铅笔 片 50 1000 2000
4 我 磁性橡皮擦 橡皮 片 30 1000 1500
5 瑟 软橡皮擦 橡皮 片 20 1000 2000
ID 产品代码 描述 使用数量 过程 小贩 等级
1 铅笔 油漆化学品 0.15 1 美国广播公司 1
2 铅笔 笔在里面 1 1 国防军 2
4 铅笔 覆盖 1 2 生长激素 3
5 铅笔 品牌标签 1 0 美国广播公司 4
6 LP 顶部橡皮擦 1 0 0
7 LP 内有 DEF 品牌铅笔 1 1 国防军 2
8 橡皮 化学 1 0 美国广播公司 4
9 橡皮 品牌标签 1 0 美国广播公司 4
select p.id,p.code,m2.*
from product p
left join materials m2 on m2.productCode=p.groupCode
where p.code='lp'

select  p.id,p.code,m1.*
from product p
left join materials m1 on m1.productCode=p.code
where p.code='lp'
ID 代码 ID 产品代码 描述 使用数量 过程 小贩 等级
1 LP 1 铅笔 油漆化学品 0.15 1 美国广播公司 1
1 LP 2 铅笔 笔在里面 1 1 国防军 2
1 LP 4 铅笔 覆盖 1 2 生长激素 3
1 LP 5 铅笔 品牌标签 1 0 美国广播公司 4
ID 代码 ID 产品代码 描述 使用数量 过程 小贩 等级
1 LP 6 LP 顶部橡皮擦 1 0 0
1 LP 7 LP 内有 DEF 品牌铅笔 1 1 国防军 2
--test: Since lvl=2 is defined in the product, materials.id=2 should not appear.
select  p.id,p.code,m1.*
from product p
left join materials m1 on (m1.productCode=p.code or m1.productCode=p.groupCode)
where p.code='lp'
ID 代码 ID 产品代码 描述 使用数量 过程 小贩 等级
1 LP 1 铅笔 油漆化学品 0.15 1 美国广播公司 1
1 LP 2 铅笔 笔在里面 1 1 国防军 2
1 LP 4 铅笔 覆盖 1 2 生长激素 3
1 LP 5 铅笔 品牌标签 1 0 美国广播公司 4
1 LP 6 LP 顶部橡皮擦 1 0 0
1 LP 7 LP 内有 DEF 品牌铅笔 1 1 国防军 2

小提琴

sql-server
  • 1 1 个回答
  • 120 Views

1 个回答

  • Voted
  1. Best Answer
    Akina
    2022-10-27T00:48:35+08:002022-10-27T00:48:35+08:00
    WITH
      cte1 AS (
    select p.id p_id,p.code p_code,m2.*
    from product p
    left join materials m2 on m2.productCode=p.groupCode
    where p.code='lp'
    ),
      cte2 AS (
    select p.id p_id,p.code p_code,m1.*
    from product p
    left join materials m1 on m1.productCode=p.code
    where p.code='lp'
    )
    SELECT cte1.*
    FROM cte1
    LEFT JOIN cte2 ON cte1.lvl = cte2.lvl
    WHERE cte2.lvl IS NULL
    UNION ALL
    SELECT *
    FROM cte2;
    

    https://dbfiddle.uk/KqDsDnko

    • 3

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve