问题描述
我正在尝试创建一个查询,以检索所有购买了一个SKU('Red399')但又没有购买第二个SKU('Red323')的所有客户。看来最好的方法是将NOT EXISTS
与子查询一起使用,以过滤掉购买“ Red323”的人。
我的查询没有返回任何错误,但是也没有返回任何结果,我认为这可能是因为我在初始WHERE
子句中有太多条件,但是我不确定:
SELECT disTINCT o."FirstName",o."LastName",o."Email",ol."SKU"
FROM flight_export_order o
JOIN flight_export_orderline ol
ON o."OrderdisplayID" = ol."OrderdisplayID"
WHERE ol."SKU" = 'Red399'
AND o."OrderDate" BETWEEN '07/22/2020' AND '08/03/2020'
AND NOT EXISTS
(SELECT disTINCT o."Email"
FROM flight_export_order o
JOIN flight_export_orderline ol
ON o."OrderdisplayID" = ol."OrderdisplayID"
WHERE ol."SKU" = 'Red323'
AND o."OrderDate" BETWEEN '07/22/2020' AND '08/03/2020')
解决方法
您不需要子查询。
您可以按客户分组并在<template>
<v-navigation-drawer
mini-variant
dark
app
permanent
:src="imageSrc"
/>
</template>
<script>
export default {
data() {
return {
imageSrc: null
};
},mounted() {
this.imageSrc = require('./src/assets/image.jpg')
},};
</script>
子句中设置条件:
having
,
开始时您处在正确的轨道上。 EXISTS
/ NOT EXISTS
是正确的工具:
SELECT o.* -- or just the columns you need
FROM flight_export_order o
WHERE o."OrderDate" BETWEEN '2020-07-22' AND '2020-08-03'
AND EXISTS (
SELECT FROM flight_export_orderline
WHERE "OrderDisplayID" = o."OrderDisplayID"
AND "SKU" = 'Red399'
)
AND NOT EXISTS (
SELECT FROM flight_export_orderline
WHERE "OrderDisplayID" = o."OrderDisplayID"
AND "SKU" = 'Red323'
);
在flight_export_orderline ("OrderDisplayID","SKU")
上使用多列索引,这是最快的。仅("OrderDisplayID")
上的索引(就像您可能有的索引)也很长。
显然,在flight_export_order("OrderDate")
上加了索引。
我认为不需要任何昂贵的聚合或DISTINCT
。参见:
此外1:如果可以的话,请尽量避免在Postgres中使用带引号的CaMeL-case标识符。参见:
除了2:reommended to use ISO 8601 date format(YYYY-MM-DD
)始终是明确的,并且与语言环境和会话设置无关。