Select 来自多个 table 并组合成单行临时 table
Select from multiple tables and combine into single row of temp table
我有三个使用相同结构的 table(FuelRates_Petrol
、FuelRates_LPG
和 FuelRates_Diesel
):
| 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 |
我需要创建一个存储过程,它将 select 每个 table 的记录与匹配的 OrganisationID
。每个table.
中会有一条匹配记录
然后我需要将结果组合成具有以下结构的临时 table 和 return 它:
| 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 |
FuelRates_Petrol
table 中的 Band1
列应插入到 FuelRates
临时 table 的 Petrol_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, Level 16, State 1, Procedure FuelRates_RetrieveList, Line 33
Insert Error: Column name or number of supplied values does not match
table definition.
第 33 行 Diesel_Band1 int,
在临时 table 创建块中。
我正在使用 SQL Server 2005。
是什么导致了这个错误,我是否以正确的方式解决了这个问题?
我知道它说错误在第 33 行,您已将其归因于 Diesel_Band1
但紧随其后的是消息:
Insert Error: Column name or number of supplied values does not match table definition.
SQL Server for defined tables 的INSERT
方法是先放置插入语句。
如果您没有按照定义的顺序插入准确的列数 table,那么您需要定义列和顺序。
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
我有三个使用相同结构的 table(FuelRates_Petrol
、FuelRates_LPG
和 FuelRates_Diesel
):
| 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 |
我需要创建一个存储过程,它将 select 每个 table 的记录与匹配的 OrganisationID
。每个table.
然后我需要将结果组合成具有以下结构的临时 table 和 return 它:
| 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 |
FuelRates_Petrol
table 中的 Band1
列应插入到 FuelRates
临时 table 的 Petrol_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, Level 16, State 1, Procedure FuelRates_RetrieveList, Line 33 Insert Error: Column name or number of supplied values does not match table definition.
第 33 行 Diesel_Band1 int,
在临时 table 创建块中。
我正在使用 SQL Server 2005。
是什么导致了这个错误,我是否以正确的方式解决了这个问题?
我知道它说错误在第 33 行,您已将其归因于 Diesel_Band1
但紧随其后的是消息:
Insert Error: Column name or number of supplied values does not match table definition.
SQL Server for defined tables 的INSERT
方法是先放置插入语句。
如果您没有按照定义的顺序插入准确的列数 table,那么您需要定义列和顺序。
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