Sql 在使用左联接和筛选器的select查询中,我做错了什么?

Sql 在使用左联接和筛选器的select查询中,我做错了什么?,sql,pervasive,pervasive-sql,actian,Sql,Pervasive,Pervasive Sql,Actian,使用Actian PSQL v13: 我正在尝试连接两个表,并根据一些条件过滤结果集。一个表是客户销售历史记录。另一个表将客户关联到购买组。并不是所有的客户都在一个购买群中,所以我正在做一个左连接,以获得所有可能的销售历史记录结果。我不希望结果包括任何购买群“SALREP”中的任何人,但我确实希望看到不在任何购买群中的客户。此外,所谓的“运费”部分正在从结果中筛选出来 我遇到的问题是,当我过滤掉“SALREP”组时,只会选择购买组中的客户;不在购买群中的所有客户都不见了 我已经通过注释“SALR

使用Actian PSQL v13:

我正在尝试连接两个表,并根据一些条件过滤结果集。一个表是客户销售历史记录。另一个表将客户关联到购买组。并不是所有的客户都在一个购买群中,所以我正在做一个左连接,以获得所有可能的销售历史记录结果。我不希望结果包括任何购买群“SALREP”中的任何人,但我确实希望看到不在任何购买群中的客户。此外,所谓的“运费”部分正在从结果中筛选出来

我遇到的问题是,当我过滤掉“SALREP”组时,只会选择购买组中的客户;不在购买群中的所有客户都不见了

我已经通过注释“SALREP”的过滤器对此进行了测试,结果集确实包括了不在购买群中的客户。我还尝试使用不同的过滤器方法,以防Actian PSQL过于挑剔。例如,我尝试了不同的非相等方法,例如!=,不是和;问题依然存在。另外,我使用了左连接和左外连接来解决同样的问题

以下是查询:

select T2.GROUP_CUST, T1.DATE_INVOICE, T1.SALESPERSON, T1.CUSTOMER, T1.PRODUCT_LINE, T1.PART, T1.DESCRIPTION, T1.QTY_SHIPPED, T1.EXTENSION 
from ORDER_HIST_LINE T1 
left join BUYING_GROUP T2 on T1.CUSTOMER=T2.CUSTOMER 
where DATE_INVOICE > '2019-06-13' and PART != 'FREIGHT'
and T2.GROUP_CUST != 'SALREP' 
and T1.CUSTOMER in ('ABC', 'DEF', 'GHI')
order by T1.CUSTOMER;
预期结果集应包括2019-06-13之后开具的任何发票,不包括名为“运费”的部分,也不包括名为“SALREP”的组中的客户。但是,实际结果集是不完整的。例如:

CUSTOMER | GROUP_CUST | DATE_INVOICE  | PART   | etc.
-----------------------------------------------------
ABC      |  A12       |  2019-06-14   | WIDGET
DEF      |  A12       |  2019-06-14   | GEAR
CUSTOMER | GROUP_CUST | DATE_INVOICE  | PART   | etc.
-----------------------------------------------------
ABC      |  A12       |  2019-06-14   | WIDGET
DEF      |  A12       |  2019-06-14   | GEAR
GHI      |            |  2019-06-15   | WIDGET
基本上,不属于任何购买群的所有客户都被排除在外

注释掉部分和T2.GROUP_CUST!='找到了SALREP’和预期结果。例如:

CUSTOMER | GROUP_CUST | DATE_INVOICE  | PART   | etc.
-----------------------------------------------------
ABC      |  A12       |  2019-06-14   | WIDGET
DEF      |  A12       |  2019-06-14   | GEAR
CUSTOMER | GROUP_CUST | DATE_INVOICE  | PART   | etc.
-----------------------------------------------------
ABC      |  A12       |  2019-06-14   | WIDGET
DEF      |  A12       |  2019-06-14   | GEAR
GHI      |            |  2019-06-15   | WIDGET
我正在考虑创建一个select查询的左连接,该查询首先从购买组中删除“SALREP”,但这不允许结果集识别和删除该组中的任何人。例:左加入选择*从购买群组中选择群组客户!='SALREP’T2

8/7/19进一步尝试:
我在MySQL v5.0.12上发现了同样的困境。我可以留下联接表以产生不匹配的结果。我可以过滤左表中那些不匹配的结果,而不会意外丢失任何内容。但是,如果不让所有不匹配的行消失,我就无法在这些不匹配的结果上筛选正确的表。

您需要在on子句的第二个表上设置条件。唯一明显的参考是T2.GROUP\U CUST,但它也可能适用于日期发票和零件:

谢谢你。文章提到,WHERE子句中的过滤也可以过滤空值,因此我们添加了一行额外的内容以确保包含空值

这使我测试并认识到,在对正确的表进行筛选时,有必要显式地声明要包括该筛选列的空值不匹配的行,否则将从结果集中删除这些不匹配的行。我还发现有必要将过滤器对放在括号中,否则结果集将爆炸。我进行了测试,发现只有在对正确的表进行过滤时才有必要这样做;针对左表进行筛选显然没有这个问题

最后答覆:

select T2.GROUP_CUST, T1.DATE_INVOICE, T1.SALESPERSON, T1.CUSTOMER, T1.PRODUCT_LINE,             
T1.PART, T1.DESCRIPTION, T1.QTY_SHIPPED, T1.EXTENSION 
from ORDER_HIST_LINE T1 
left join BUYING_GROUP T2 on T1.CUSTOMER=T2.CUSTOMER 
where DATE_INVOICE > '2019-06-13' and PART != 'FREIGHT' 
and (T2.GROUP_CUST != 'SALREP' or T2.GROUP_CUST is null) 
and T1.CUSTOMER in ('ABC', 'DEF', 'GHI') 
order by T1.CUSTOMER;

注意这行和T2.GROUP_CUST!='SALREP'或T2.GROUP\u CUST为空。

非常感谢,戈登。看来它成功了。我不知道直接在条款上加条件。我总是想先将基本结果关联起来,然后在谓词中进行过滤以显示最终结果。起初,这似乎起到了作用,但在针对T2进行过滤时遇到另一个问题之后,事实证明,真正发生的是,值SALREP正在从GROUP_CUST列中剥离,与SALREP关联的行仍在结果集中。可能是我,但似乎没有必要显式允许左连接上不匹配的行,无论应用了哪个表的筛选器。