单个 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
 )