单个 table 上的嵌套查询
Nested queries on a single table
我在查询时遇到了一些问题,我有一个table,我想在其中挑选出标有不同字段的项目。
具体来说,传送带上的箱子已经四处移动并在不同位置做了标记。
下面是我所拥有的(它不起作用 - returns 内部 select 子句中的多个记录导致错误)。
字段条码不是唯一的。它应该工作的方式是它会四处走动,每次它经过某些区域时,都会为该条形码添加一条新记录。我想找到去过 3 个不同区域的条形码,其中之一是 lane_id LIKE(CRANE%_IN)
我知道我的错误是合乎逻辑的,但我无法理解关于同一个 table 和子查询的查询。
这个概念很简单(我可以在 2 分钟内用任何语言完成)它需要在 SQL (postgres) 中完成。
SELECT barcode, lane_id
FROM acts_divert_log
WHERE lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND divstat IN (0, 1)
AND barcode =
(
SELECT barcode FROM acts_divert_log WHERE
lane_id LIKE ('CRANE%_IN')
AND divstat IN (0, 1)
AND barcode =
(
SELECT barcode FROM acts_divert_log WHERE
lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND divstat IN (0, 1)
)
);
预期结果应该是在 2 个 GTP0% 区域和至少一个 CRANE%_IN 区域中看到的唯一条形码。
任何帮助或提示将不胜感激。 SQL真的不是我的强项
尝试这样的事情:
SELECT barcode, lane_id
FROM acts_divert_log l
WHERE divstat IN (0, 1)
AND EXISTS (
SELECT barcode
FROM acts_divert_log t2
WHERE divstat IN (0, 1)
AND l.barcode = t2.barcode
GROUP BY t2.barcode
HAVING
SUM(CASE WHEN lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04') THEN 1 ELSE 0 END) >= 2
AND SUM(CASE WHEN lane_id LIKE ('CRANE%_IN') THEN 1 ELSE 0 END) >= 1
)
;
这是关系分裂的情况。有很多可能的方法来解决这个问题。一种简单快速的方法:
SELECT barcode
, a1.lane_id AS lane_id1
, a2.lane_id AS lane_id2
, a3.lane_id AS lane_id3
FROM acts_divert_log a1
JOIN acts_divert_log a2 USING (barcode)
JOIN acts_divert_log a3 USING (barcode)
WHERE a1.lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND a2.lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND a3.lane_id LIKE 'CRANE%_IN'
AND a1.divstat IN (0, 1)
AND a2.divstat IN (0, 1)
AND a3.divstat IN (0, 1)
AND a1.lane_id <> a2.lane_id; -- assuming you want distinct lane_ids
我们在这个相关问题下组装了一系列技术:
- How to filter SQL results in a has-many-through relation
您需要匹配索引才能加快速度。详细信息取决于有关 table 定义、数据分布、基数等的未公开信息。
Select distinct Barcode, lane_id from acts_divert_log
Where Barcode in (
Select barcode from (
Select Barcode, sum(cnt_gtp) as gto
, sum(cnt_crane) as crane
from (Select Barcode
, case when (lane_id in ('GTP01' , 'GTP02', 'GTP03', 'GTP04'))
Then 1 else 0 end as cnt_gtp,
, case when (lane_id like 'CRANE%_IN') then 1 else 0 end as cnt_crane
from acts_divert_log
Where divstat in (0,1)
and ((lane_id in ('GTP01' , 'GTP02', 'GTP03', 'GTP04'))
OR (lane_id like 'CRANE%_IN') )
) as aa
Group by barcode
) as bb
Where gtp>=2 and crane>=1
)
我在查询时遇到了一些问题,我有一个table,我想在其中挑选出标有不同字段的项目。
具体来说,传送带上的箱子已经四处移动并在不同位置做了标记。
下面是我所拥有的(它不起作用 - returns 内部 select 子句中的多个记录导致错误)。
字段条码不是唯一的。它应该工作的方式是它会四处走动,每次它经过某些区域时,都会为该条形码添加一条新记录。我想找到去过 3 个不同区域的条形码,其中之一是 lane_id LIKE(CRANE%_IN)
我知道我的错误是合乎逻辑的,但我无法理解关于同一个 table 和子查询的查询。
这个概念很简单(我可以在 2 分钟内用任何语言完成)它需要在 SQL (postgres) 中完成。
SELECT barcode, lane_id
FROM acts_divert_log
WHERE lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND divstat IN (0, 1)
AND barcode =
(
SELECT barcode FROM acts_divert_log WHERE
lane_id LIKE ('CRANE%_IN')
AND divstat IN (0, 1)
AND barcode =
(
SELECT barcode FROM acts_divert_log WHERE
lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND divstat IN (0, 1)
)
);
预期结果应该是在 2 个 GTP0% 区域和至少一个 CRANE%_IN 区域中看到的唯一条形码。
任何帮助或提示将不胜感激。 SQL真的不是我的强项
尝试这样的事情:
SELECT barcode, lane_id
FROM acts_divert_log l
WHERE divstat IN (0, 1)
AND EXISTS (
SELECT barcode
FROM acts_divert_log t2
WHERE divstat IN (0, 1)
AND l.barcode = t2.barcode
GROUP BY t2.barcode
HAVING
SUM(CASE WHEN lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04') THEN 1 ELSE 0 END) >= 2
AND SUM(CASE WHEN lane_id LIKE ('CRANE%_IN') THEN 1 ELSE 0 END) >= 1
)
;
这是关系分裂的情况。有很多可能的方法来解决这个问题。一种简单快速的方法:
SELECT barcode
, a1.lane_id AS lane_id1
, a2.lane_id AS lane_id2
, a3.lane_id AS lane_id3
FROM acts_divert_log a1
JOIN acts_divert_log a2 USING (barcode)
JOIN acts_divert_log a3 USING (barcode)
WHERE a1.lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND a2.lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND a3.lane_id LIKE 'CRANE%_IN'
AND a1.divstat IN (0, 1)
AND a2.divstat IN (0, 1)
AND a3.divstat IN (0, 1)
AND a1.lane_id <> a2.lane_id; -- assuming you want distinct lane_ids
我们在这个相关问题下组装了一系列技术:
- How to filter SQL results in a has-many-through relation
您需要匹配索引才能加快速度。详细信息取决于有关 table 定义、数据分布、基数等的未公开信息。
Select distinct Barcode, lane_id from acts_divert_log
Where Barcode in (
Select barcode from (
Select Barcode, sum(cnt_gtp) as gto
, sum(cnt_crane) as crane
from (Select Barcode
, case when (lane_id in ('GTP01' , 'GTP02', 'GTP03', 'GTP04'))
Then 1 else 0 end as cnt_gtp,
, case when (lane_id like 'CRANE%_IN') then 1 else 0 end as cnt_crane
from acts_divert_log
Where divstat in (0,1)
and ((lane_id in ('GTP01' , 'GTP02', 'GTP03', 'GTP04'))
OR (lane_id like 'CRANE%_IN') )
) as aa
Group by barcode
) as bb
Where gtp>=2 and crane>=1
)