女士访问重复的记录

时间:2018-09-16 17:39:28

标签: sql ms-access

我的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 <> "");

您能否就构建第一个查询的正确方法分享您的想法,以免对性能造成如此严重的影响?

我浏览了问题列表,但找不到类似的内容。

3 个答案:

答案 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 }} 去做这个。

Nz Function help

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 ="") )