5

これは、過去数時間私を困惑させました。この段階では、助けが必要だと思います...

1 つのテーブルから複数のグループを比較し、列 B にリストされている項目が一致する場所を特定する必要があります。例えば: -

Col A...............Col B
John................Apple
John................Orange
John................Banana
Mary................Orange
Mary................Strawberry
David...............Apple
David...............Orange
David...............Banana

列 B のアイテムが一致するため、'John' と 'David' を返してほしい。これが理にかなっていることを願っています!前もって感謝します!G

4

3 に答える 3

6

これがこのソリューションのSQLフィドルです。自分で試してみることができます。

 select A.ColA Person1, B.ColA Person2
    from (select ColA, count(ColB) CountBs
          from tbl
          group by ColA) G1
    join (select ColA, count(ColB) CountBs
          from tbl
          group by ColA) G2 on G1.ColA < G2.ColA
                           and G1.CountBs = G2.CountBs
    join tbl A on A.ColA = G1.ColA
    join tbl B on B.ColA = G2.ColA and A.ColB = B.ColB
group by A.ColA, B.ColA, G1.CountBs
having count(distinct A.ColB) = G1.CountBs

-- subqueries G1 and G2 are the same and count the expected colB's per colA
-- G1 and G2 are joined together to get the candidate matches
--    of ColA with the same number of ColB's
-- we then use G1 and G2 to join into tbl, and further join
--    between A and B where the ColB's match
-- finally, we count the matches between A and B and make sure the counts match
--    the expected count of B's for the pairing
于 2012-09-27T19:43:16.320 に答える
0

複数の人に一致する列 b のアイテムを持っているすべての人 (おそらく 2 つ以上の一致を探していると思いますか?):

SELECT tableName.ColA, tableName.ColB
FROM (SELECT ColB
    FROM tableName
    GROUP BY ColB
    HAVING COUNT(1) > 1) fruits
INNER JOIN tableName ON fruits.ColB = tableName.ColB
ORDER BY tableName.ColB, tableName.ColA
于 2012-09-27T21:04:22.447 に答える
0

次の場合、ColA1 は ColA2 と一致します:
カウント (ColA1) = カウント (ColA2) = カウント (ColA1 x ColA2)

このアプローチは、クエリの速度を最適化しようとします。

複数回使用され、PK を宣言できるため、raw カウントを実体化します。
(CTE は単なる構文であり、評価されます)

RA.rawcount = RB.rawcount では、カウントが等しい場合にのみ結合を評価できます。また、クエリ プランは、それが最初に実行されることを示しています。

create table #rawcount
(ColA varchar(50) not null primary key, rawcount int  not null)  
insert into #rawcount
select   [ColA], COUNT(*) as  [rawCount]
from     [tbl]
group by [ColA]
order by [ColA]

select a.ColA as ColA1, b.ColA as ColA2, COUNT(*) [matchcount]
from tbl A
join tbl B
 on  a.ColB = b.ColB 
 and a.ColA < b.ColA
join #rawcount RA 
 on  RA.ColA = A.ColA
join #rawcount RB 
 on  RB.ColA = B.ColA
where RA.rawcount = RB.rawcount  -- only evaluate if count same
group by a.ColA, b.ColA, RA.rawcount
having COUNT(*) = RA.rawcount 
于 2012-09-28T01:35:18.397 に答える