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 / 问题 / 262177
Accepted
VansFannel
VansFannel
Asked: 2020-03-19 00:59:03 +0800 CST2020-03-19 00:59:03 +0800 CST 2020-03-19 00:59:03 +0800 CST

将三个查询合二为一

  • 772

我正在使用 SQL Server 13.0.5102.14。

我有这三个表:

CREATE TABLE [dbo].[ProductionOrder]
(
    [ProductionOrderId] INT NOT NULL IDENTITY (1, 1), 
    [ProductId] INT NOT NULL, 
    [Name] NVARCHAR(50) NOT NULL,
    CONSTRAINT [PK_ProductionOrder] PRIMARY KEY CLUSTERED 
    (
        [ProductionOrderId] ASC
    ))
)

CREATE TABLE [dbo].[Code]
(
    [CodeId] int NOT NULL IDENTITY(1, 1),
    [Serial] [varchar](38) not null,
    [ProductionOrderId] int NOT NULL,
    [AggregationLevel] [tinyint] NOT NULL,
     CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED 
    (
        [CodeId] ASC
    ),
    CONSTRAINT [UC_Code_Serial] UNIQUE ([Serial]),
    CONSTRAINT [FK_Code_ProductionOrder_ProductionOrderId] FOREIGN KEY ([ProductionOrderId]) REFERENCES [dbo].[ProductionOrder] ([ProductionOrderId]))
)

CREATE TABLE [dbo].[VariableData]
(
    [ProductionOrderId] INT NOT NULL,
    [AggregationLevelConfigurationId] TINYINT NOT NULL, 
    [VariableDataId] VARCHAR(4) NOT NULL, 
    [Value] NVARCHAR(200) NOT NULL,
    CONSTRAINT [PK_VariableData] PRIMARY KEY CLUSTERED 
    (
        [AggregationLevelConfigurationId] ASC,
        [ProductionOrderId] ASC,
        [VariableDataId] ASC
    ), 
    CONSTRAINT [FK_VariableData_AggregationLevelConfiguration_AggregationLevelConfigurationId] FOREIGN KEY ([AggregationLevelConfigurationId], [ProductionOrderId]) REFERENCES [dbo].[AggregationLevelConfiguration] ([AggregationLevelConfigurationId], [ProductionOrderId]) ON DELETE CASCADE,
    CONSTRAINT [FK_VariableData_ProductionOrder_ProductionOrderId] FOREIGN KEY ([ProductionOrderId]) REFERENCES [dbo].[ProductionOrder] ([ProductionOrderId]),
    CONSTRAINT [CK_VariableData_VariableDataId] CHECK (([VariableDataId]<>N''))
)

CREATE TABLE [dbo].[Product]
(
    [ProductId] INT NOT NULL IDENTITY (1, 1),
    [ProductCode] VARCHAR(14) not null,
    [Description] NVARCHAR(50) NULL,
    [LawId] TINYINT NOT NULL,  
    [Name] NVARCHAR(100) NOT NULL, 
    [Comment] NVARCHAR(100) NULL, 
    CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED 
    (
        [ProductId] ASC
    ),
    CONSTRAINT [CK_Product_ProductCode] CHECK (([ProductCode]<>N'')),
    CONSTRAINT [CK_Product_Name] CHECK (([Name]<>N''))
)

CREATE TABLE [dbo].[AggregationChildren]
(
    [AggregationChildrenId] INT NOT NULL,
    [AggregationId] INT NOT NULL,
    [Position] [int] NOT NULL,
    CONSTRAINT [PK_AggregationChildren] PRIMARY KEY CLUSTERED 
    (
        [AggregationChildrenId] ASC
    ), 
    CONSTRAINT [FK_AggregationChildren_Aggregation_AggregationId] FOREIGN KEY ([AggregationId]) REFERENCES [Aggregation]([AggregationId]) ON DELETE CASCADE, 
    CONSTRAINT [FK_AggregationChildren_Code_AggregationChildrenId] FOREIGN KEY ([AggregationChildrenId]) REFERENCES [Code]([CodeId])
)

CREATE TABLE [dbo].[Aggregation]
(
    [AggregationId] INT NOT NULL,
    [Created] varchar(34) NULL,
    CONSTRAINT [PK_Aggregation] PRIMARY KEY CLUSTERED
    (
        [AggregationId] ASC
    ),
    CONSTRAINT [FK_Aggregation_Code_AggregationId] FOREIGN KEY ([AggregationId]) REFERENCES [dbo].[Code] ([CodeId])
)

我有这三个工作查询:

declare @prodID int = 1;
declare @lotAI varchar(4) = '10';

select cod.Serial as ItemNO
     , varData.Value as Lot
     , pro.ProductCode as Product

  from dbo.VariableData varData 
        JOIN dbo.Code cod ON varData.ProductionOrderId = cod.ProductionOrderId
        JOIN dbo.ProductionOrder proOrd ON varData.ProductionOrderId = proOrd.ProductionOrderId
        JOIN dbo.Product pro on proOrd.ProductId = pro.ProductId   

 where varData.ProductionOrderId = @prodID and
       varData.VariableDataId = @lotAI and
       varData.AggregationLevelConfigurationId = 1 and
       cod.AggregationLevel = 1


select cod.Serial as Box

  from dbo.Code cod
       LEFT JOIN dbo.AggregationChildren agg on agg.AggregationId = cod.CodeId

 where cod.ProductionOrderId = @prodID and
       cod.AggregationLevel = 2


select cod.Serial as Pallet

  from dbo.Code cod
       JOIN dbo.Aggregation agg on agg.AggregationId = cod.CodeId

 where cod.ProductionOrderId = @prodID and
       cod.AggregationLevel = 3

我想将所有这些加入到一个查询中。我的问题是我dbo.Code用来获得三个不同的值:

  • select cod.Serial as ItemNO
  • select cod.Serial as Box
  • select cod.Serial as Pallet

如何将这三个查询合二为一?

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

1 个回答

  • Voted
  1. Best Answer
    Scott Hodgin - Retired
    2020-03-19T01:38:23+08:002020-03-19T01:38:23+08:00

    您应该能够内联selectsforBox并且如本Pallet例所示:

    DECLARE @prodID INT = 1;
    DECLARE @lotAI VARCHAR(4) = '10';
    
    SELECT cod.Serial AS ItemNO
        ,varData.Value AS Lot
        ,pro.ProductCode AS Product
        ,(
            SELECT cod.Serial AS Box
            FROM dbo.Code cod
            LEFT JOIN dbo.AggregationChildren agg ON agg.AggregationId = cod.CodeId
            WHERE cod.ProductionOrderId = @prodID
                AND cod.AggregationLevel = 2
            ) AS Box
        ,(
            SELECT cod.Serial AS Pallet
            FROM dbo.Code cod
            JOIN dbo.Aggregation agg ON agg.AggregationId = cod.CodeId
            WHERE cod.ProductionOrderId = @prodID
                AND cod.AggregationLevel = 3
            ) AS Pallet
    FROM dbo.VariableData varData
    JOIN dbo.Code cod ON varData.ProductionOrderId = cod.ProductionOrderId
    JOIN dbo.ProductionOrder proOrd ON varData.ProductionOrderId = proOrd.ProductionOrderId
    JOIN dbo.Product pro ON proOrd.ProductId = pro.ProductId
    WHERE varData.ProductionOrderId = @prodID
        AND varData.VariableDataId = @lotAI
        AND varData.AggregationLevelConfigurationId = 1
        AND cod.AggregationLevel = 1
    
    • 1

相关问题

  • 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