单个表上的嵌套查询

时间:2017-10-30 02:32:56

标签: sql postgresql relational-division

我在查询时遇到了一些问题,我有一个表格,我想要挑选出标有不同字段的项目。

具体而言,传送带上的盒子已移动并标记在不同位置。

以下是我所拥有的(它不起作用 - 在内部select子句中返回多条记录,导致错误)。

字段条形码不是唯一的。它应该工作的方式是它将四处走动,并且每次通过某些区域时,将为该条形码添加新记录。我想找到已经到过3个不同区域的条形码,其中一个是lane_id LIKE(CRANE%_IN)

我知道我的错误是合乎逻辑的,但是我无法通过子查询了解同一个表上的查询。

这个概念很简单(我可以在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真的不是我的强项。

3 个答案:

答案 0 :(得分:0)

尝试这样的事情:

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
)
;

答案 1 :(得分:0)

关系划分的情况。有很多种方法可以解决这个问题。一种简单快捷的方法:

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

我们在这个相关问题下聚集了各种技术:

您需要匹配索引才能快速完成此操作。详细信息取决于有关表定义,数据分布,基数等的未公开信息。

答案 2 :(得分:0)

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
 )