sql server表的行之间成对关系的查询结果重复

luaexgnf  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(283)

我致力于建立一个15世纪末大西洋商人的数据库。我写这个查询是为了找到相同合同中的个人关系。它工作得很好,但它会产生重复的结果,例如a、 “b,01-01-1500”和“b,a,01-01-1500”。对我来说,这是一个问题,因为我在这一点上没有考虑方向性。我试着简单地过滤结果,但它产生了一个更重要的问题,因为它只留下了一个结果,不管关联发生在不同的日期或不同的合同(这可能是我的错,过滤是我仍在学习的东西)
怎样才能避免这个问题?

SELECT d1.gen_id as 'source',
d2.gen_id as 'target',
        c.date as 'timestamp'
from (
Select * from deed_party1
    ) as d1
    INNER JOIN
    (
    select * from deed_party1
    ) as d2
    on d1.deed_id = d2.deed_id
inner join contracts as c
on d1.deed_id = c.id
where d1.gen_id != d2.gen_id AND c.date between '1500-01-01' AND '1509-12-31';

谢谢你的阅读和帮助,

hgb9j2n6

hgb9j2n61#

你只是想 < 而不是 != . 但子查询不是必需的,因此:

select d1.gen_id as source, d2.gen_id as target,
       c.date as timestamp
from deed_party1 d1 join
     deed_party1 d2
     on d1.deed_id = d2.deed_id and
        d1.gen_id < d2.gen_id join
     contracts c
     on d1.deed_id = c.id
where c.date between '1500-01-01' AND '1509-12-31';

也:
不要不必要地使用子查询。在大多数数据库中,这只是不必要地混乱了查询。mysql倾向于具体化子查询,因此子查询也会对性能产生(负面)影响。
不要使用单引号分隔列名。单引号只能用于字符串和日期常量。
如果必须转义列名,请使用反勾号。
不要选择已经被sql使用的名称,例如 timestamp . 这在mysql中是安全的,但只是一种不好的做法。

相关问题