Sql 从多个表中选择并合并到临时表的单行中

Sql 从多个表中选择并合并到临时表的单行中,sql,sql-server,stored-procedures,temp-tables,Sql,Sql Server,Stored Procedures,Temp Tables,我有三个表(FuelRates\u汽油、FuelRates\u液化石油气和FuelRates\u柴油)使用相同的结构: | OrganisationID | Band1 | Band2 | Band3 | ModifiedDate | |----------------|-------|-------|-------|---------------------| | 1 | 10 | 12 | 19 | 01/05/2016 19:23:

我有三个表(
FuelRates\u汽油
FuelRates\u液化石油气
FuelRates\u柴油
)使用相同的结构:

| OrganisationID | Band1 | Band2 | Band3 | ModifiedDate        |
|----------------|-------|-------|-------|---------------------|
| 1              | 10    | 12    | 19    | 01/05/2016 19:23:21 |
| 2              | 11    | 12    | 20    | 02/05/2016 19:23:21 |
我需要创建一个存储过程,从每个表中选择具有匹配的
组织ID的记录。每个表中将有一条匹配的记录

然后,我需要将结果合并到具有以下结构的临时表中,并返回它:

| OrganisationID | Petrol_Band1 | Petrol_Band2 | Petrol_Band3 | LPG_Band1 | LPG_Band2 | LPG_Band3 | Diesel_Band1 | Diesel_Band2 | Diesel_Band3 | ModifiedDate        |
|----------------|--------------|--------------|--------------|-----------|-----------|-----------|--------------|--------------|--------------|---------------------|
| 1              | 10           | 12           | 19           | 10        | 12        | 19        | 10           | 12           | 19           | 01/05/2016 19:23:21 |
应将
燃油费率
表中的
Band1
列插入到
燃油费率
临时表的
汽油费率
列中。其余列应遵循此约定创建一行,如上所示

SQL并不是我的拿手好戏,但这是我的努力:

ALTER PROCEDURE [dbo].[FuelRates_RetrieveList] 
    @OrganisationID int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    CREATE TABLE #FuelRates(
    OrganisationID int,
    Petrol_Band1 int, 
    Petrol_Band2 int,
    Petrol_Band3 int,
    LPG_Band1 int,
    LPG_Band2 int,
    LPG_Band3 int,
    Diesel_Band1 int,
    Diesel_Band2 int,
    Diesel_Band3 int,
    ModifiedDate DateTime)

    SELECT Band1 As Petrol_Band1, Band2 As Petrol_Band2, Band3 As Petrol_Band3, ModifiedDate, OrganisationID FROM [FuelRates_Petrol]
    WHERE OrganisationID = @OrganisationID
    INSERT INTO #FuelRates

    SELECT Band1 As LPG_Band1, Band2 As LPG_Band2, Band3 As LPG_Band3 FROM [FuelRates_LPG]
    WHERE OrganisationID = @OrganisationID
    INSERT INTO #FuelRates

    SELECT Band1 As Diesel_Band1, Band2 As Diesel_Band2, Band3 As Diesel_Band3 FROM [FuelRates_Diesel]
    WHERE OrganisationID = @OrganisationID
    INSERT INTO #FuelRates

    SELECT * FROM #FuelRates

    DROP TABLE #FuelRates
END
执行此操作时,会出现以下错误:

Msg 213,16级,状态1,程序FuelRates_RetrieveList,第33行 插入错误:提供的值的列名或数目不匹配 表定义

第33行是临时表创建块中的Diesel\U Band1 int

我正在使用SQLServer2005


是什么导致了这个错误?我是否以正确的方式处理了这个问题?

我知道它说错误出现在第33行,您将其归因于
Diesel_Band1
,但紧接着就是消息:

插入错误:提供的值的列名或数目与表定义不匹配

SQL Server用于定义表的
INSERT
方法是首先放置INSERT语句

如果没有按照与定义的表完全相同的顺序插入确切数量的列,则需要定义列和顺序

INSERT INTO myTable (column1, column2, column3,...columnN)
将插入内容更改为以下内容:

INSERT INTO #FuelRates
    (Petrol_Band1, Petrol_Band2, Petrol_Band3, ModifiedDate, OrganisationID)
    SELECT Band1 As Petrol_Band1, Band2 As Petrol_Band2, Band3 As Petrol_Band3, ModifiedDate, OrganisationID 
    FROM [FuelRates_Petrol]
    WHERE OrganisationID = @OrganisationID

我知道它说错误出现在第33行,您将其归因于
Diesel_Band1
,但紧接着就是消息:

插入错误:提供的值的列名或数目与表定义不匹配

SQL Server用于定义表的
INSERT
方法是首先放置INSERT语句

如果没有按照与定义的表完全相同的顺序插入确切数量的列,则需要定义列和顺序

INSERT INTO myTable (column1, column2, column3,...columnN)
将插入内容更改为以下内容:

INSERT INTO #FuelRates
    (Petrol_Band1, Petrol_Band2, Petrol_Band3, ModifiedDate, OrganisationID)
    SELECT Band1 As Petrol_Band1, Band2 As Petrol_Band2, Band3 As Petrol_Band3, ModifiedDate, OrganisationID 
    FROM [FuelRates_Petrol]
    WHERE OrganisationID = @OrganisationID
你可以试试这个

ALTER PROCEDURE [dbo].[FuelRates_RetrieveList] 
    @OrganisationID int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    CREATE TABLE #FuelRates(
    OrganisationID int,
    Petrol_Band1 int, 
    Petrol_Band2 int,
    Petrol_Band3 int,
    LPG_Band1 int,
    LPG_Band2 int,
    LPG_Band3 int,
    Diesel_Band1 int,
    Diesel_Band2 int,
    Diesel_Band3 int,
    ModifiedDate DateTime)

    INSERT INTO #FuelRates
    (OrganisationID, Petrol_Band1, Petrol_Band2, Petrol_Band3,LPG_Band1,LPG_Band2,LPG_Band3,
      Diesel_Band1, Diesel_Band2, Diesel_Band3, ModifiedDate)
    SELECT OrganisationID,
        p.Band1 As Petrol_Band1, p.Band2 As Petrol_Band2, p,Band3 As Petrol_Band3, 
        lp.Band1 As LPG_Band1, lp.Band2 As LPG_Band2, lp.Band3 As LPG_Band3,
        d.Band1 As Diesel_Band1, d.Band2 As Diesel_Band2, d.Band3 As Diesel_Band3,
        GetDate() as ModifiedDate
    FROM [FuelRates_Petrol] p
    LEFT JOIN FuelRates_LPG lp on lp.OrganisationID = p.OrganisationID
    LEFT JOIN FuelRates_Diesel d on d.OrganizationID = p.OrganisationID
    WHERE p.OrganisationID = @OrganisationID

    SELECT * FROM #FuelRates

    DROP TABLE #FuelRates
END
你可以试试这个

ALTER PROCEDURE [dbo].[FuelRates_RetrieveList] 
    @OrganisationID int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    CREATE TABLE #FuelRates(
    OrganisationID int,
    Petrol_Band1 int, 
    Petrol_Band2 int,
    Petrol_Band3 int,
    LPG_Band1 int,
    LPG_Band2 int,
    LPG_Band3 int,
    Diesel_Band1 int,
    Diesel_Band2 int,
    Diesel_Band3 int,
    ModifiedDate DateTime)

    INSERT INTO #FuelRates
    (OrganisationID, Petrol_Band1, Petrol_Band2, Petrol_Band3,LPG_Band1,LPG_Band2,LPG_Band3,
      Diesel_Band1, Diesel_Band2, Diesel_Band3, ModifiedDate)
    SELECT OrganisationID,
        p.Band1 As Petrol_Band1, p.Band2 As Petrol_Band2, p,Band3 As Petrol_Band3, 
        lp.Band1 As LPG_Band1, lp.Band2 As LPG_Band2, lp.Band3 As LPG_Band3,
        d.Band1 As Diesel_Band1, d.Band2 As Diesel_Band2, d.Band3 As Diesel_Band3,
        GetDate() as ModifiedDate
    FROM [FuelRates_Petrol] p
    LEFT JOIN FuelRates_LPG lp on lp.OrganisationID = p.OrganisationID
    LEFT JOIN FuelRates_Diesel d on d.OrganizationID = p.OrganisationID
    WHERE p.OrganisationID = @OrganisationID

    SELECT * FROM #FuelRates

    DROP TABLE #FuelRates
END

谢谢谢奈斯。我的代码现在看起来是这样的:它生成了3行,而不是我要查找的那一行。我能不能把这些合并成一行?J Greene的回答就是我要说的。唯一需要注意的是,我会确保直接在
FROM
后面的表有OrganizationID的记录,否则即使其他表有记录,也不会返回任何内容。谢谢Shaneis。我的代码现在看起来是这样的:它生成了3行,而不是我要查找的那一行。我能不能把这些合并成一行?J Greene的回答就是我要说的。唯一需要注意的是,我会确保直接在
FROM
后面的表有OrganizationID的记录,否则即使其他表有记录,也不会返回任何内容。这就是为什么我喜欢这样!谢谢这是一种享受。虽然您在SELECT中有语法错误(
p,Band3作为汽油机)\u Band3
-逗号而不是句号),这就是我喜欢的原因!谢谢这是一种享受。尽管您在SELECT中有语法错误(
p,第3栏为汽油色\u第3栏
-逗号而不是句号)