SQL 查询 crystal 报告产生重复结果
SQL query for crystal reports produces duplicate results
我创建了 3 个表 TstInvoice、TstProd、TstPersons 并添加了一些数据:
INVOICE_NBR CLIENT_NR VK_CONTACT
A10304 003145 AT
A10305 000079 EA
A10306 004458 AT
A10307 003331 JDJ
PROD_NR INVOICE_NBR
P29366 A10304
P29367 A10304
P29368 A10305
P29369 A10306
P29370 A10306
P29371 A10307
PERS_NR INITIALEN STATUS PERSOON
0001 AT 7 Alice Thompson
0002 EA 1 Edgar Allen
0003 JDJ 1 John Doe Joe
0004 AT 1 Arthur Twins
传递给 crystal 报告的参数是 INVOICE_NBR。
在我的 crystal 报告中,我放入了一些来自数据库的字段和一个 sql 表达式:
(
SELECT "TstPersons"."PERSOON" FROM "TstPersons"
WHERE "TstPersons"."INITIALEN" = "TstInvoice"."VK_CONTACT" AND "TstPersons"."STATUS" = 1
)
生成的完整查询:
SELECT "TstInvoice"."INVOICE_NBR", "TstInvoice"."CLIENT_NR", "TstPersons"."STATUS", "TstPersons"."PERSOON", "TstProd"."PROD_NR", "TstProd"."INVOICE_NBR", (
SELECT "TstPersons"."PERSOON" FROM "TstPersons"
WHERE "TstPersons"."INITIALEN" = "TstInvoice"."VK_CONTACT" AND "TstPersons"."STATUS" = 1
)
FROM ("GCCTEST"."dbo"."TstInvoice" "TstInvoice" INNER JOIN "GCCTEST"."dbo"."TstProd" "TstProd" ON "TstInvoice"."INVOICE_NBR"="TstProd"."INVOICE_NBR") INNER JOIN "GCCTEST"."dbo"."TstPersons" "TstPersons" ON "TstInvoice"."VK_CONTACT"="TstPersons"."INITIALEN"
WHERE "TstInvoice"."INVOICE_NBR"='A10304'
结果如截图所示:
如您所见,TstPersons.PERSOON 字段由 Alice Thompson 填充,sql 表达式字段由 Arthur Twins 正确填充。但是,我只想看到 prod_nr 一次。尽管我只要求状态 1,但由于 "AT" 的双重条目,使用此查询它会生成两次产品编号。我可以只删除旧条目,但我想知道是否可以这样。
* edit * 我将 status = 1 添加到 "record selection formula editor",这似乎有效。根本不需要 sql 表达式字段。不确定这是否是正确的方法。
所以现在看起来像这样:
SELECT "TstInvoice"."INVOICE_NBR", "TstInvoice"."CLIENT_NR", "TstPersons"."STATUS", "TstPersons"."PERSOON", "TstProd"."PROD_NR", "TstProd"."INVOICE_NBR"
FROM ("GCCTEST"."dbo"."TstInvoice" "TstInvoice" INNER JOIN "GCCTEST"."dbo"."TstProd" "TstProd" ON "TstInvoice"."INVOICE_NBR"="TstProd"."INVOICE_NBR") INNER JOIN "GCCTEST"."dbo"."TstPersons" "TstPersons" ON "TstInvoice"."VK_CONTACT"="TstPersons"."INITIALEN"
WHERE "TstInvoice"."INVOICE_NBR"='A10304' AND "TstPersons"."STATUS"=1
由于在 INITIALEN
列中发现重复值,您的查询中的连接非常弱。使用 STATUS = 1
标准是一种解决方法,而不是一种解决方案,因为如果您需要报告联系人状态不是 1 的发票,您将需要修改报告的设计以允许您加入工作,因为 STATUS
在发票上找不到允许正确加入的值。
如果您有另一个联系人的姓名首字母和状态值与另一个联系人相同,您也 运行 有此变通办法完全崩溃的风险。
解决此问题的正确方法是通过具有唯一值的字段将 TstInvoice
连接到 TstPersons
。 PERS_NR
列似乎是一个不错的选择。
这还需要重新设计 TstInvoice
table 以将 PERS_NR
列作为外键包含在内。
invoices 和 persons 之间更强的连接也将消除您选择语句中对该子查询的需要。这会将您的查询简化为以下内容:
SELECT "TstInvoice"."INVOICE_NBR", "TstInvoice"."CLIENT_NR", "TstPersons"."STATUS", "TstPersons"."PERSOON", "TstProd"."PROD_NR", "TstProd"."INVOICE_NBR"
FROM "GCCTEST"."dbo"."TstInvoice" "TstInvoice"
INNER JOIN "GCCTEST"."dbo"."TstProd" "TstProd"
ON "TstInvoice"."INVOICE_NBR"="TstProd"."INVOICE_NBR"
INNER JOIN "GCCTEST"."dbo"."TstPersons" "TstPersons"
ON "TstInvoice"."PERS_NR"="TstPersons"."PERS_NR"
WHERE "TstInvoice"."INVOICE_NBR"='A10304'
我创建了 3 个表 TstInvoice、TstProd、TstPersons 并添加了一些数据:
INVOICE_NBR CLIENT_NR VK_CONTACT
A10304 003145 AT
A10305 000079 EA
A10306 004458 AT
A10307 003331 JDJ
PROD_NR INVOICE_NBR
P29366 A10304
P29367 A10304
P29368 A10305
P29369 A10306
P29370 A10306
P29371 A10307
PERS_NR INITIALEN STATUS PERSOON
0001 AT 7 Alice Thompson
0002 EA 1 Edgar Allen
0003 JDJ 1 John Doe Joe
0004 AT 1 Arthur Twins
传递给 crystal 报告的参数是 INVOICE_NBR。
在我的 crystal 报告中,我放入了一些来自数据库的字段和一个 sql 表达式:
(
SELECT "TstPersons"."PERSOON" FROM "TstPersons"
WHERE "TstPersons"."INITIALEN" = "TstInvoice"."VK_CONTACT" AND "TstPersons"."STATUS" = 1
)
生成的完整查询:
SELECT "TstInvoice"."INVOICE_NBR", "TstInvoice"."CLIENT_NR", "TstPersons"."STATUS", "TstPersons"."PERSOON", "TstProd"."PROD_NR", "TstProd"."INVOICE_NBR", (
SELECT "TstPersons"."PERSOON" FROM "TstPersons"
WHERE "TstPersons"."INITIALEN" = "TstInvoice"."VK_CONTACT" AND "TstPersons"."STATUS" = 1
)
FROM ("GCCTEST"."dbo"."TstInvoice" "TstInvoice" INNER JOIN "GCCTEST"."dbo"."TstProd" "TstProd" ON "TstInvoice"."INVOICE_NBR"="TstProd"."INVOICE_NBR") INNER JOIN "GCCTEST"."dbo"."TstPersons" "TstPersons" ON "TstInvoice"."VK_CONTACT"="TstPersons"."INITIALEN"
WHERE "TstInvoice"."INVOICE_NBR"='A10304'
结果如截图所示:
如您所见,TstPersons.PERSOON 字段由 Alice Thompson 填充,sql 表达式字段由 Arthur Twins 正确填充。但是,我只想看到 prod_nr 一次。尽管我只要求状态 1,但由于 "AT" 的双重条目,使用此查询它会生成两次产品编号。我可以只删除旧条目,但我想知道是否可以这样。
* edit * 我将 status = 1 添加到 "record selection formula editor",这似乎有效。根本不需要 sql 表达式字段。不确定这是否是正确的方法。
所以现在看起来像这样:
SELECT "TstInvoice"."INVOICE_NBR", "TstInvoice"."CLIENT_NR", "TstPersons"."STATUS", "TstPersons"."PERSOON", "TstProd"."PROD_NR", "TstProd"."INVOICE_NBR"
FROM ("GCCTEST"."dbo"."TstInvoice" "TstInvoice" INNER JOIN "GCCTEST"."dbo"."TstProd" "TstProd" ON "TstInvoice"."INVOICE_NBR"="TstProd"."INVOICE_NBR") INNER JOIN "GCCTEST"."dbo"."TstPersons" "TstPersons" ON "TstInvoice"."VK_CONTACT"="TstPersons"."INITIALEN"
WHERE "TstInvoice"."INVOICE_NBR"='A10304' AND "TstPersons"."STATUS"=1
由于在 INITIALEN
列中发现重复值,您的查询中的连接非常弱。使用 STATUS = 1
标准是一种解决方法,而不是一种解决方案,因为如果您需要报告联系人状态不是 1 的发票,您将需要修改报告的设计以允许您加入工作,因为 STATUS
在发票上找不到允许正确加入的值。
如果您有另一个联系人的姓名首字母和状态值与另一个联系人相同,您也 运行 有此变通办法完全崩溃的风险。
解决此问题的正确方法是通过具有唯一值的字段将 TstInvoice
连接到 TstPersons
。 PERS_NR
列似乎是一个不错的选择。
这还需要重新设计 TstInvoice
table 以将 PERS_NR
列作为外键包含在内。
invoices 和 persons 之间更强的连接也将消除您选择语句中对该子查询的需要。这会将您的查询简化为以下内容:
SELECT "TstInvoice"."INVOICE_NBR", "TstInvoice"."CLIENT_NR", "TstPersons"."STATUS", "TstPersons"."PERSOON", "TstProd"."PROD_NR", "TstProd"."INVOICE_NBR"
FROM "GCCTEST"."dbo"."TstInvoice" "TstInvoice"
INNER JOIN "GCCTEST"."dbo"."TstProd" "TstProd"
ON "TstInvoice"."INVOICE_NBR"="TstProd"."INVOICE_NBR"
INNER JOIN "GCCTEST"."dbo"."TstPersons" "TstPersons"
ON "TstInvoice"."PERS_NR"="TstPersons"."PERS_NR"
WHERE "TstInvoice"."INVOICE_NBR"='A10304'