PostgreSQL结果集长度因连接而异
环境是:PostgreSQL 9.3 我有这样一个要求:PostgreSQL结果集长度因连接而异,sql,postgresql,outer-join,Sql,Postgresql,Outer Join,环境是:PostgreSQL 9.3 我有这样一个要求: SELECT DISTINCT orders.id AS count, orders.state AS state, coalesce(discounts.amount, 0) AS discount, CASE WHEN (order_logs.id IS NULL) THEN 0 ELSE 1 END
SELECT
DISTINCT
orders.id AS count,
orders.state AS state,
coalesce(discounts.amount, 0) AS discount,
CASE WHEN (order_logs.id IS NULL) THEN 0
ELSE 1 END AS attempted,
CASE WHEN (order_logs_1.id IS NULL) THEN 0
ELSE 1 END AS processed,
-- the following 2-by-2 lines are comment-swapped
-- users.name AS "group",
-- order_logs_2.operator_id AS group_raw
goods.name AS "group",
goods.id AS group_raw
FROM
orders
LEFT OUTER JOIN
order_logs
ON
order_logs.order_id = orders.id
AND
order_logs.state <= 1999
AND
order_logs.state != 1000
LEFT OUTER JOIN
order_logs AS order_logs_1
ON
order_logs_1.order_id = orders.id
AND
order_logs_1.state <= 1999
AND
order_logs_1.state != 1000
AND
(order_logs_1.flags & 1) > 0
LEFT OUTER JOIN
discounts
ON
discounts.user_id = orders.user_id
AND
discounts.goods_id = orders.goods_id
--the following 2 joins refer to the first commented-out lines in SELECT expression list
-- LEFT OUTER JOIN
-- order_logs AS order_logs_2
-- ON
-- order_logs_2.order_id = orders.id
-- AND
-- order_logs_2.state IN (
-- 1999,
-- 1100,
-- 1150,
-- 1151,
-- 1003,
-- 1202,
-- 1203,
-- 1200,
-- 1201,
-- 1002
-- )
-- AND
-- (order_logs_2.flags & 1 > 0)
-- LEFT OUTER JOIN
-- users
-- ON
-- users.id = order_logs_2.operator_id
-- this join refers to the last 2 lines in expression list
LEFT OUTER JOIN
goods
ON
goods.id = orders.goods_id
WHERE
orders.ts_spawn >= 1414789200
AND
orders.ts_spawn < 1417381200
ORDER BY "count"
然后排除相应的JOIN子句,最后一个被注释掉,但没有成功。请发布两个显示意外行为的最小查询。您写了关于更改分组和更改联接表的内容,但不清楚您到底更改了什么;将在A中多次显示那些在B中有多个可连接行的行。这样,左连接将增加结果行的数量。SQL查询中的注释显示了应如何更改。当前表单按商品分组。当我更改按运算符\u id分组时,我注释掉SELECT表达式中的最后两行,注释掉最后一个左外部联接,但取消注释已注释的SELECT表达式行,取消注释已注释的两个左外部联接。对于这种情况下的重复行,在“JOIN on”表达式上有多个关系:在第一个选定列上有DISTINCT,该列是基本查询表的PK,也没有简化对“minimal”的查询,因为这并不明显,简化后的表单将显示我的查询的真正功能。有时,当一个人试图混淆他的代码,然后寻求帮助时,唯一的反应就是“给我看代码!”。示例中使用的DISTINCT将删除重复的行。如果您想在一列上使用它,您应该编写不同的ONorders.id
order_logs_2.operator_id AS "group",
order_logs_2.operator_id AS group_raw