Sql 优化查询

Sql 优化查询,sql,db2,Sql,Db2,我有一个表,源列中有两种源,一种是外部的,另一种是内部的。我的要求是根据COLUMNA和COLUMNB找出外部和内部的相同记录。如果COLUMNA的内部和外部记录匹配,我需要获取相应的IDID列值,该值在内部和外部都是唯一的。我的表中有数百万条记录。每个源中都会有重复的记录。我已经给出了一个writeni的查询,我使用UNION ALL来提高性能,尽管最终输出中会出现重复的ID,但这需要2个小时。所以我可以重写这个查询,我在这里使用DB2 例如,如果下面是我的输入记录 预期产量 下面给出了已经编

我有一个表,源列中有两种源,一种是外部的,另一种是内部的。我的要求是根据COLUMNA和COLUMNB找出外部和内部的相同记录。如果COLUMNA的内部和外部记录匹配,我需要获取相应的IDID列值,该值在内部和外部都是唯一的。我的表中有数百万条记录。每个源中都会有重复的记录。我已经给出了一个writeni的查询,我使用UNION ALL来提高性能,尽管最终输出中会出现重复的ID,但这需要2个小时。所以我可以重写这个查询,我在这里使用DB2

例如,如果下面是我的输入记录

预期产量

下面给出了已经编写的查询

select  ID from TABLE where COLUMNA in(
(select SRC.COLUMNA from TABLE SRC,TABLE REF  
where SRC.SOURCE<>'EXTERNAL' and REF.SOURCE='EXTERNAL' and SRC.COLUMNA=REF.COLUMNA))
UNION ALL
select  ID from TABLE where COLUMNB in(
(select SRC.COLUMNB from TABLE SRC,TABLE REF  
where SRC.SOURCE<>'EXTERNAL' and REF.SOURCE='EXTERNAL' and 
SRC.COLUMNB=REF.COLUMNB))
您似乎需要ID,其中任一列在两侧重复

为此,您可以使用窗口功能:

select distinct t.id
from (select t.*,
             min(source) over (partition by column_a) as min_a,
             max(source) over (partition by column_a) as max_a,
             min(source) over (partition by column_b) as min_b,
             max(source) over (partition by column_b) as max_b
      from t
     ) t
where min_a <> max_a or min_b <> max_b;
这假设您在问题中只有两个来源。如果还有其他查询,则在子查询中添加where子句,以便仅对这两个查询进行筛选。

尝试此操作

SELECT ID FROM (
    SELECT ID
    , SUM(SOURCE = 'INTERNAL') OVER(PARTITION BY CA) AS INT_A
    , SUM(SOURCE = 'EXTERNAL') OVER(PARTITION BY CA) AS EXT_A
    , SUM(SOURCE = 'INTERNAL') OVER(PARTITION BY CB) AS INT_B
    , SUM(SOURCE = 'EXTERNAL') OVER(PARTITION BY CB) AS EXT_B
    FROM 
        T
) WHERE (INT_A > 0 AND EXT_A) > 0 OR (INT_B > 0 AND EXT_B) > 0
ORDER BY ID
返回

ID
--
 1
 2
 3
 4
 5
 7
 8
 9
试试这个:

SELECT ID
--, COLUMNA_SOURCE_DISTINCT, COLUMNB_SOURCE_DISTINCT
FROM
(
SELECT 
  T.*
-- COUNT DISTINCT OLAP specification is not supported; we emulate it below
-- COUNT(DISTINCT SOURCE) OVER (PARTITION BY COLUMNA) COLUMNA_SOURCE_DISTINCT 
, COUNT(NULLIF(SOURCE, LAG(SOURCE) OVER (PARTITION BY COLUMNA ORDER BY SOURCE))) 
  OVER (PARTITION BY COLUMNA) COLUMNA_SOURCE_DISTINCT 
, COUNT(NULLIF(SOURCE, LAG(SOURCE) OVER (PARTITION BY COLUMNB ORDER BY SOURCE))) 
  OVER (PARTITION BY COLUMNB) COLUMNB_SOURCE_DISTINCT 
FROM TABLE T
)
WHERE COLUMNA_SOURCE_DISTINCT + COLUMNB_SOURCE_DISTINCT <> 2;
没有OLAP功能的替代解决方案
您的预期输出正确吗?根据我对您要求的理解,您只需要返回ID的3和7是的,我的预期输出是正确的。我需要来自这两个源的ID,也需要基于这两列的ID。尽管ID 1与COLUMNA匹配,但它与COLUMNB的值匹配。对不起,如果我写的要求不清楚。但是我希望你从我写的查询中得到我的要求你应该把你的数据贴成文本而不是图片我正在试着把它贴成文本。但格式不正确。使用固定宽度格式,但每行缩进4个空格,或按Ctrl-K或按{}代码示例按钮。理想情况下,在我的回答中,将数据显示为VALUES子句。实际上,有多个内部源,我将其统称为内部源。再次对此表示抱歉查询文本中有一个输入错误:您对max_x列使用了min函数:在我将所有其他源更新为Internal之后,查询工作正常。但是它比我原来的查询慢:-我尝试了上面的查询,但它给了我错误,如缺少右括号,我还对sumsource“EXTERNAL”做了一些修改,由于我有多个内部源,它们在我的需求中作为内部调用,因此上述SQL中的SOURCE='EXTERNAL'位仅适用于DB211.1.1.0及更高版本,因为它们支持布尔数据类型。在早期版本中,使用例如CASE WHEN SOURCE='EXTERNAL',然后使用1 ELSE 0 end谢谢,我也将尝试此查询。。从第一次运行中,我可以看出,获取记录需要花费很多时间
SELECT ID
--, COLUMNA_SOURCE_DISTINCT, COLUMNB_SOURCE_DISTINCT
FROM
(
SELECT 
  T.*
-- COUNT DISTINCT OLAP specification is not supported; we emulate it below
-- COUNT(DISTINCT SOURCE) OVER (PARTITION BY COLUMNA) COLUMNA_SOURCE_DISTINCT 
, COUNT(NULLIF(SOURCE, LAG(SOURCE) OVER (PARTITION BY COLUMNA ORDER BY SOURCE))) 
  OVER (PARTITION BY COLUMNA) COLUMNA_SOURCE_DISTINCT 
, COUNT(NULLIF(SOURCE, LAG(SOURCE) OVER (PARTITION BY COLUMNB ORDER BY SOURCE))) 
  OVER (PARTITION BY COLUMNB) COLUMNB_SOURCE_DISTINCT 
FROM TABLE T
)
WHERE COLUMNA_SOURCE_DISTINCT + COLUMNB_SOURCE_DISTINCT <> 2;
SELECT ID
FROM TABLE A
WHERE EXISTS 
(
SELECT 1
FROM TABLE B
WHERE B.COLUMNA=A.COLUMNA 
AND 
   CASE A.SOURCE WHEN 'EXTERNAL' THEN 'EXTERNAL' ELSE 'INTERNAL' END
<> CASE B.SOURCE WHEN 'EXTERNAL' THEN 'EXTERNAL' ELSE 'INTERNAL' END
)

  UNION

SELECT ID
FROM TABLE A
WHERE EXISTS 
(
SELECT 1
FROM TABLE B
WHERE B.COLUMNB=A.COLUMNB 
AND 
   CASE A.SOURCE WHEN 'EXTERNAL' THEN 'EXTERNAL' ELSE 'INTERNAL' END
<> CASE B.SOURCE WHEN 'EXTERNAL' THEN 'EXTERNAL' ELSE 'INTERNAL' END
);