要求输入一个已经存在的参数值
Asking to enter a parameter value that already exists
我有一个名为 "FPB" 的三列 table 价格区间,看起来像这样:
[Part Number] [Quantity] [Price]
AAA-AAAA 100 1.23
AAA-AAAA 200 1.15
BBB-BBBB 100 5.60
CCC-CCCC 500 3.21
....
其中每个零件号在多行中有多个条目。
我正在尝试重新组织 table 使其看起来更像这样
[Part Number] [Quantity1] [Price 1] [Quantity 2] [Price 2] [Quantity 3....
AAA-AAAA 100 1.23 200 1.15 ....
BBB-BBBB 100 5.60 ...
CCC-CCCC 500 3.21 ...
...
其中每个零件号的所有条目都合并到一行中。第一个数量列应该有最低的可用数量,第二个应该有第二小的数量,等等。我试图通过首先使用 GROUP BY 创建一个只有唯一零件号的 1 列 table,然后为每个列中包含我想要的信息的列创建更多 tables,然后按部件号加入它。在倒数第二个部分计算每种类型的第二小数量时出现问题。
SELECT PNs.[Part Number], Q1T.Q1, P1T.Price, Q2T.Q2
FROM
(SELECT
[Part Number]
FROM FPB
GROUP BY [Part Number]
) AS PNs,
(SELECT
[Part Number],
MIN(Quantity) AS Q1
FROM FPB
GROUP BY [Part Number]
) AS Q1T,
(SELECT
*
FROM FPB
) AS P1T,
(SELECT
[Part Number],
MIN(IIF(Quantity>Q1T.Q1,Quantity)) AS Q2
FROM FPB
GROUP BY [Part Number]
) AS Q2T
WHERE
PNs.[Part Number] = Q1T.[Part Number]
AND P1T.[Part Number] = PNs.[Part Number]
AND P1T.Quantity = Q1T.Q1
AND Q2T.[Part Number] = PNs.[Part Number]
当我 运行 这个查询时,它要求我输入 Q1T.Q1 的参数值,即使它已经存在。如果我删除 Q2T 的代码部分以及对 Q2 的任何引用,它将正常工作,并且它不会询问 Q1T.Q1 的其他实例的值。为什么 Q1T.Q1 没有那个部分的值,我该如何解决?作为旁注,我正在使用名为 PHPRunner 的程序的 SQL 功能,它的客户端不支持 UPDATE/DELETE/INSERT/CREATE 查询、UNION 和 DISTINCT。
根据您的问题,当您定义派生的 table Q2T 时,Q1T 仍然是一个无效对象。您需要尝试解决此问题。
编辑:
假设你只有 2 级列要处理,代码如下,我测试过。效果不错。
select q5.*,q3.quantity, q3.price
from
(select *
from FPB as Q1
where 0 = (select count(distinct(quantity)) from FPB as Q2 where Q2.quantity < Q1.quantity AND Q2.[part number] = Q1.[part number])) as Q5
,
(
select distinct(temp.[part number]),Q2.quantity, Q2.price from FPB as temp
left join
(select *
from FPB as Q4
where 1 = (select count(distinct(quantity)) from #test as Q2 where Q2.quantity < Q4.quantity AND Q2.[PART NUMBER] = Q4.[PART NUMBER])) as Q2
on temp.[PART NUMBER] = Q2.[PART NUMBER]
) as Q3
where Q5.[PART NUMBER] = Q3.[PART NUMBER]
您调用的查询不正确。
Q1T 是内部 select 语句,而在 Q2T(其他内部 select 语句)中,您不能使用 Q1T
中的任何字段
SQL 服务器引发错误:')' 附近的语法不正确。
要克服此限制,您应该使用 通用 Table 表达式 CTE
对于 PN、Q1T、P1T、Q2T
CTE 就像动态视图。
这是自 sql 2008 年以来的一项新功能,非常强大。
评论:https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx
尝试为这四个CTE绘制一个关系数据模型,以确保它们之间存在基于您的where条件的关系。
我认为此查询中的逻辑可能会在执行期间引发运行时错误:
例如无法绑定多部分标识符 "Q1T.Q1"。
编辑:
对于 Ms-Access 您可以创建四个查询:PNs、Q1T、P1T、Q2T 每个都在一个单独的查询中,第五个查询加入这些查询并添加哪里的条件。
在这种情况下,您不会收到任何语法错误。并将获得 数据模型 与免费关系 :) .
您正在寻找这样的东西。
select
p1.PartNumber,
ifnull(max(p2.Quantity), 0) + 1 as LowerQuantity,
p1.Quantity as UpperQuantity,
p1.Price,
count(p2.PartNumber) + 1 as PriceTier
from
FPB p1 left outer join FPB p2
on p2.PartNumber = p1.PartNumber and p2.Quantity < p1.Quantity
从那里很容易旋转以插入新的 table:
into into NewFPB (PartNumber, Quantity1, Price1, Quantity2, Price2, ...)
select
PartNumber,
min(switch(PriceTier = 1, UpperQuantity)) as Quantity1,
min(switch(PriceTier = 2, UpperQuantity)) as Quantity2, ...
min(switch(PriceTier = 1, Price)) as Price1,
min(switch(PriceTier = 2, Price)) as Price2, ...
from (
select
p1.PartNumber,
ifnull(max(p2.Quantity), 0) + 1 as LowerQuantity,
p1.Quantity as UpperQuantity,
p1.Price,
count(p2.PartNumber) + 1 as PriceTier
from
FPB p1 left outer join FPB p2
on p2.PartNumber = p1.PartNumber and p2.Quantity < p1.Quantity
) data
您可能需要稍微调整一下,Access 才能接受它。但是核心思想在那里。
我有一个名为 "FPB" 的三列 table 价格区间,看起来像这样:
[Part Number] [Quantity] [Price]
AAA-AAAA 100 1.23
AAA-AAAA 200 1.15
BBB-BBBB 100 5.60
CCC-CCCC 500 3.21
....
其中每个零件号在多行中有多个条目。
我正在尝试重新组织 table 使其看起来更像这样
[Part Number] [Quantity1] [Price 1] [Quantity 2] [Price 2] [Quantity 3....
AAA-AAAA 100 1.23 200 1.15 ....
BBB-BBBB 100 5.60 ...
CCC-CCCC 500 3.21 ...
...
其中每个零件号的所有条目都合并到一行中。第一个数量列应该有最低的可用数量,第二个应该有第二小的数量,等等。我试图通过首先使用 GROUP BY 创建一个只有唯一零件号的 1 列 table,然后为每个列中包含我想要的信息的列创建更多 tables,然后按部件号加入它。在倒数第二个部分计算每种类型的第二小数量时出现问题。
SELECT PNs.[Part Number], Q1T.Q1, P1T.Price, Q2T.Q2
FROM
(SELECT
[Part Number]
FROM FPB
GROUP BY [Part Number]
) AS PNs,
(SELECT
[Part Number],
MIN(Quantity) AS Q1
FROM FPB
GROUP BY [Part Number]
) AS Q1T,
(SELECT
*
FROM FPB
) AS P1T,
(SELECT
[Part Number],
MIN(IIF(Quantity>Q1T.Q1,Quantity)) AS Q2
FROM FPB
GROUP BY [Part Number]
) AS Q2T
WHERE
PNs.[Part Number] = Q1T.[Part Number]
AND P1T.[Part Number] = PNs.[Part Number]
AND P1T.Quantity = Q1T.Q1
AND Q2T.[Part Number] = PNs.[Part Number]
当我 运行 这个查询时,它要求我输入 Q1T.Q1 的参数值,即使它已经存在。如果我删除 Q2T 的代码部分以及对 Q2 的任何引用,它将正常工作,并且它不会询问 Q1T.Q1 的其他实例的值。为什么 Q1T.Q1 没有那个部分的值,我该如何解决?作为旁注,我正在使用名为 PHPRunner 的程序的 SQL 功能,它的客户端不支持 UPDATE/DELETE/INSERT/CREATE 查询、UNION 和 DISTINCT。
根据您的问题,当您定义派生的 table Q2T 时,Q1T 仍然是一个无效对象。您需要尝试解决此问题。
编辑: 假设你只有 2 级列要处理,代码如下,我测试过。效果不错。
select q5.*,q3.quantity, q3.price
from
(select *
from FPB as Q1
where 0 = (select count(distinct(quantity)) from FPB as Q2 where Q2.quantity < Q1.quantity AND Q2.[part number] = Q1.[part number])) as Q5
,
(
select distinct(temp.[part number]),Q2.quantity, Q2.price from FPB as temp
left join
(select *
from FPB as Q4
where 1 = (select count(distinct(quantity)) from #test as Q2 where Q2.quantity < Q4.quantity AND Q2.[PART NUMBER] = Q4.[PART NUMBER])) as Q2
on temp.[PART NUMBER] = Q2.[PART NUMBER]
) as Q3
where Q5.[PART NUMBER] = Q3.[PART NUMBER]
您调用的查询不正确。
Q1T 是内部 select 语句,而在 Q2T(其他内部 select 语句)中,您不能使用 Q1T
中的任何字段SQL 服务器引发错误:')' 附近的语法不正确。
要克服此限制,您应该使用 通用 Table 表达式 CTE 对于 PN、Q1T、P1T、Q2T
CTE 就像动态视图。 这是自 sql 2008 年以来的一项新功能,非常强大。
评论:https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx
尝试为这四个CTE绘制一个关系数据模型,以确保它们之间存在基于您的where条件的关系。 我认为此查询中的逻辑可能会在执行期间引发运行时错误:
例如无法绑定多部分标识符 "Q1T.Q1"。
编辑:
对于 Ms-Access 您可以创建四个查询:PNs、Q1T、P1T、Q2T 每个都在一个单独的查询中,第五个查询加入这些查询并添加哪里的条件。 在这种情况下,您不会收到任何语法错误。并将获得 数据模型 与免费关系 :) .
您正在寻找这样的东西。
select
p1.PartNumber,
ifnull(max(p2.Quantity), 0) + 1 as LowerQuantity,
p1.Quantity as UpperQuantity,
p1.Price,
count(p2.PartNumber) + 1 as PriceTier
from
FPB p1 left outer join FPB p2
on p2.PartNumber = p1.PartNumber and p2.Quantity < p1.Quantity
从那里很容易旋转以插入新的 table:
into into NewFPB (PartNumber, Quantity1, Price1, Quantity2, Price2, ...)
select
PartNumber,
min(switch(PriceTier = 1, UpperQuantity)) as Quantity1,
min(switch(PriceTier = 2, UpperQuantity)) as Quantity2, ...
min(switch(PriceTier = 1, Price)) as Price1,
min(switch(PriceTier = 2, Price)) as Price2, ...
from (
select
p1.PartNumber,
ifnull(max(p2.Quantity), 0) + 1 as LowerQuantity,
p1.Quantity as UpperQuantity,
p1.Price,
count(p2.PartNumber) + 1 as PriceTier
from
FPB p1 left outer join FPB p2
on p2.PartNumber = p1.PartNumber and p2.Quantity < p1.Quantity
) data
您可能需要稍微调整一下,Access 才能接受它。但是核心思想在那里。