【问题标题】:DISTINCT not eliminating the duplicate records- Why?DISTINCT 没有消除重复记录 - 为什么?
【发布时间】:2014-11-12 12:07:29
【问题描述】:

DISTINCT 在 DB2 数据库查询中无法正常工作

SELECT
    DISTINCT PF1
FROM
    (
        SELECT
                DISTINCT PF1
            FROM
                RELATIONS
        UNION
        SELECT
                DISTINCT PF2
            FROM
                RELATIONS
    )
WHERE
    PF1 NOT IN (
        SELECT
                DISTINCT NAME
            FROM
                REFERENCES
            WHERE
                TYPE = 'F'
    );

这个查询给出了重复的结果

C1:PROV
C1:PROV
WK:HEADER
WK:HEADER
WK:HEADER
etc

什么东西/设置是造成这种异常行为的原因??

仅供参考:相同的查询在另一台机器的数据库上给出正确的结果。

已编辑 这是表的结构

CREATE TABLE RELATIONS (
    PF1 VARCHAR(54) NOT NULL,
    PF1TXT VARCHAR(50),
    PF2 VARCHAR(54) NOT NULL,
    SEQ DOUBLE NOT NULL,
    PF2TXT VARCHAR(50),
  UNIQUE (PF1, SEQ, PF2)
);

CREATE TABLE REFERENCES (
    NAME1 VARCHAR(54) NOT NULL,
    NAMETXT VARCHAR(50) NOT NULL,
    NAME VARCHAR(54) NOT NULL,
    TYPE VARCHAR(1) NOT NULL,
    UNIQUE (NAME1, NAMETXT, NAME, TYPE) 
);

【问题讨论】:

  • 可以分享一下表格属性吗?
  • 你想要什么样的输出?不同值的列表?
  • 是的@stormrage,我只想要不重复的独特结果。
  • 您的查询没问题。我在mysql上试过,它给出了正确的结果。但我必须将您的 REFERENCES 表重命名为 REFERENCE 因为它在某种程度上是一个关键字,如果我不更改它会返回错误。我不太确定,但请尝试重命名它。
  • 没有@stormrage,不需要重命名表名,我已经发布了更改的表/字段名。

标签: java sql eclipse db2


【解决方案1】:

UNION 应该已经消除了重复。您可以稍微重新构造您的查询,它应该可以工作。我只制作了REFS CTE,以防您的实际代码比这更复杂,以减少重复:

WITH REFS (NAME) AS (
    SELECT NAME
    FROM REFERENCES
    WHERE TYPE = 'F'
)

SELECT PF1
FROM RELATIONS
WHERE PF1 NOT IN (
    SELECT NAME FROM REFS
)

    UNION 

SELECT PF2
FROM RELATIONS
WHERE PF2 NOT IN (
    SELECT NAME FROM REFS
)

我在我的 DB2 for LUW 9.7 上对此进行了测试,它对我来说工作正常。

【讨论】:

  • 谢谢@bhamby,这个查询只要稍作改动就可以正常工作。
【解决方案2】:

不确定,但您可以为派生表指定别名。在我的测试中它有效。

SELECT DISTINCT PF1 FROM (
    SELECT DISTINCT PF1 FROM RELATIONS
        UNION SELECT DISTINCT PF2 FROM RELATIONS
    )  as rel -- the name to derived table
WHERE PF1 NOT IN (
    SELECT DISTINCT NAME FROM REFERENCES
        WHERE TYPE = 'F');

【讨论】:

  • 嗯,@Bill 你在回答中所说的正是我在 2 小时前在这里回答的内容。
  • 是的@TioDavid,它是同一个副本,并没有消除重复。
  • @Kishore 我遇到了类似的麻烦,但最终是 DB2 的版本。我对版本 10.0 进行了查询,生产版本是 9.7。但是,我看到您选择了一个答案,这非常好。祝你好运:)
猜你喜欢
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
相关资源
最近更新 更多