我的MS Access查询有问题,希望您能为我提供帮助。 如果父级不是“ GYF”,“ RGY”和“ DRF”,则我希望产品“ ABC”具有代码“ 6029”。
映射如下所示:
| Output_code | Account | Product | Parent |
+-------------+---------+----------+--------+
| 6029 | income | ABC | |
| 7029 | income | ABC | GYF |
| 7029 | income | ABC | RGY |
| 7029 | income | ABC | DRF |
+-------------+---------+----------+--------+
最终结果将是:
+-------------+---------+----------+--------+
| 6029 | income | ABC | DTF |
| 6029 | income | ABC | DHS |
| 7029 | income | ABC | GYF |
| 7029 | income | ABC | RGY |
| 7029 | income | ABC | DRF |
+-------------+---------+----------+-------
它现在如何工作:
+-------------+---------+----------+--------+
| 6029 | income | ABC | DTF |
| 6029 | income | ABC | DHS |
| 7029 | income | ABC | GYF |
| 7029 | income | ABC | RGY |
| 7029 | income | ABC | DRF |
| 6029 | income | ABC | GYF |
| 6029 | income | ABC | RGY |
| 6029 | income | ABC | DRF |
+-------------+---------+----------+--------+
Select A.*, B.Output_Code, "Product" as Comment from Source as A
inner join Mapping as B on (B.Account=A.Account and B.Product = A.Product)
where (B.Parent = "" or B.Parent <> A.Parent);
union all
Select A.*, B.Output_Code, "Product+Parent" as Comment from Source as A
inner join Mapping as B on (B.Account=A.Account and B.Product = A.Product
and A.Parent = B.Parent) where B.Parent <> "";
第一部分(产品)无法正常工作,并且ABC + RGY之类的组合出现两次,分别为“ 6029”和“ 7029”。
我尝试在select中使用select(为此我引入了rowid),它可以工作,但是现在我的查询需要30分钟才能处理(而不是5分钟)。
Select A.*, B.Output_Code, "Product" as Comment from Source as A inner join
Mapping as B on (B.Account=A.Account and B.Product = A.Product)
where (B.Parent = "" or B.Parent <> A.Parent) and A.rowid not in (Select
A.rowid from Source as A inner join Mapping as B on (B.Account=A.Account and
B.Product = A.Product and A.Parent = B.Parent) where B.Parent <> "");
您能否就构建第一个查询的正确方法分享您的想法,以免对性能造成如此严重的影响?
我浏览了问题列表,但找不到类似的内容。
答案 0 :(得分:1)
“寻求简单的解决方案,而不是完美的解决方案”
SELECT
IIF(Parent IN ('GYF','RGY','DRF'), 7029, 6029) as Output_code
FROM
Product
PS;我实际上并没有做太多的访问SQL-我可能未使用正确的字符串定界符等-您可能需要使该查询有些微不足道
编辑:如果要扩展映射,则应考虑使用左联接:
Select s.*, IIF(m.Output_Code IS NULL, 6029, m.output_Code)
FROM
source s
LEFT OUTER JOIN
mapping m
on (m.Account=s.Account and m.Product = s.Product and m.parent = s.parent)
从映射表中删除6029行(冗余)
LEFT JOIN连接匹配的行,并保留从左侧(源)到右侧(图)中没有匹配项的行,但在右侧的值中放置null。相比之下,内部联接会丢弃没有匹配项的行。我们要利用的是“源中的这一行在地图上不匹配”的质量
这意味着'GYF','RGY','DRF'行在映射表中将具有匹配项,它们将不会为null,这些行的IIF将为false,将使用映射中的代码< / p>
其他行将不匹配,这些行的m.Output_code将为NULL,IIF为TRUE,将使用值6029
答案 1 :(得分:0)
我将对您的基表进行一些假设。
您的Mapping
表如下所示:
| Output_code | Product | Parent |
|-------------|---------|--------|
| 7029 | ABC | DRF |
| 7029 | ABC | GYF |
| 7029 | ABC | RGY |
| 8593 | DEF | XYZ |
您的Source
表如下所示:
| Product | Parent |
|---------|--------|
| ABC | DTF |
| ABC | DHA |
| ABC | GYF |
| ABC | RGY |
| ABC | DRF |
| DEF | XYZ |
| DEF | ZXL |
此SQL将返回所有带有正确Source
的{{1}}值。如果没有Output_code
,则会返回一个Null
值:
Output_code
如果唯一的产品是 ABC ,而您只想将所有 SELECT Mapping.Output_code
, Source.Product
, Source.Parent
FROM Source LEFT JOIN Mapping ON Source.Product = Mapping.Product AND
Source.Parent = Mapping.Parent
| Output_code | Product | Parent |
|-------------|---------|--------|
| | ABC | DTF |
| | ABC | DHA |
| 7029 | ABC | GYF |
| 7029 | ABC | RGY |
| 7029 | ABC | DRF |
| 8593 | DEF | XYZ |
| | DEF | ZXL |
值替换为NULL
,则可以将6029
行更新为{{1 }} 去做这个。
Mapping.Output_code
但是我希望您有多个产品,并且如果没有可用的父产品,则希望产品DEF显示不同的值。
为此,请添加名为NZ(Mapping.Output_code, 6029)
的第三个表,该表列出了尚无任何产品的代码:
SELECT NZ(Mapping.Output_code,6029)
, Source.Product
, Source.Parent
FROM Source LEFT JOIN Mapping ON Source.Product = Mapping.Product AND
Source.Parent = Mapping.Parent
| Expr1000 | Product | Parent |
|----------|---------|--------|
| 6029 | ABC | DTF |
| 6029 | ABC | DHA |
| 7029 | ABC | GYF |
| 7029 | ABC | RGY |
| 7029 | ABC | DRF |
| 8593 | DEF | XYZ |
| 6029 | DEF | ZXL |
主键: 产品
然后您可以使用此新表替换表中找到的所有Null值:
NoMap
答案 2 :(得分:0)
您可以使用它。
Select A.*, NZ(B1.Output_Code, B2.Output_Code) as "Output_Code" from
(Source as A
left join Mapping as B1 on (B1.Account=A.Account and B1.Product = A.Product and B1.Parent = A.Parent ) )
left join Mapping as B2 on (B2.Account=A.Account and B2.Product = A.Product and (B2.Parent Is Null or B2.Parent ="") )