我有一个包含两列的表:
primId column1 column2
1 98 62
2 62 98
3 3 105
4 105 3
5 11 4
我需要获得第二行,第四行,第五行。 如果98,62出现一次,则62,98不能出现(如果可能,我需要最新值)。 我从这个链接Removing Mirrored Pairs from SQL Join获得了帮助,但没有运气。 这些值在较大或较小程度上彼此无关。 请告诉我如何才能得到这个结果。 这可能与Sql查询。 感谢
答案 0 :(得分:3)
你可以这样做:
select t1.*
from yourTable t1
left join
yourTable t2
on t1.column1 = t2.column2 and
t1.column2 = t2.column1
where t2.column1 is null or
t1.column1 > t1.column2
镜像行将被连接,由于第二个where
条件,您将只接受它们一次,并且未镜像的行将不会被连接,因此您将使用第一个{ {1}}条件。
修改强>
要让最后一对夫妇返回,您可以使用此方法
where
内部查询将为每对夫妇返回最高select t1.*
from yourTable t1
join (
select max(primId) as primId,
case when column1 > column2 then column2 else column1 end c1,
case when column1 < column2 then column2 else column1 end c2
from yourTable
group by case when column1 > column2 then column2 else column1 end,
case when column1 < column2 then column2 else column1 end
) t2
on t1.primId = t2.primId
,无论顺序如何。将它与源表连接起来,就可以将其用作过滤器。
您可以看到它有效here
答案 1 :(得分:0)
您可以使用以下查询:
SELECT DISTINCT LEAST(column1, column2) AS column1,
GREATEST(column1, column2) AS column2
FROM mytable
注意:如果字段顺序与您无关,则上述查询有效。否则你必须使用JOIN
之类的@Stefano建议。
答案 2 :(得分:0)
如果表中存在查询结果集中的行并不重要,则可以使用least
和greatest
,以便每对检索一行。
select distinct least(column1,column2) as col1, greatest(column1,column2) as col2
from tablename
如果检索到的行 出现在表格中,请使用上一个查询并将其加入现有表格。
select t.column1,t.column2
from tablename t
left join (select least(column1,column2) as col1, greatest(column1,column2) as col2
from tablename
group by least(column1,column2), greatest(column1,column2)
having count(*)>1
) x on x.col1=t.column1 and x.col2=t.column2
where x.col1 is null and x.col2 is null
答案 3 :(得分:0)
如果您想确保保留原始对(因此不允许4,1作为输出),那么以下内容应该非常有效:
select t.*
from t
where t.column1 <= t.column2
union all
select t.*
from t
where t.column1 > t.column2 and
not exists (select 1 from t t2 where t2.column1 = t.column2 and t2.column2 = t.column1);
为获得最佳性能,您需要t(column1, column2)
上的索引。