SQL - 是否可以从一列中选择所有不同的值,其中来自另一列的所有值都匹配?

时间:2014-10-01 14:55:43

标签: sql sql-server dataset distinct

我已经研究过以前的问题,但找不到复制我的或易于理解的问题。我希望这是一个相对简单的回答,如果我有重复,抱歉。

我在SQL中有一个表格可以对我们的所有报告进行编目(根据下面的简化版本) 它有ReportCountryID作为主键,ReportIDCountryIDCountryName

ReportCountryID  ReportID    CountryID   CountryName
0001                 8447           12   Bosnia
0002                 9740           13   Bosnia & Herzegovina
0003                 9278           13   Bosnia & Herzegovina
0004                 8447          128   Czech Rep
0005                 9740           25   Czech Republic
0006                 9278           25   Czech Republic
0007                 9714           83   Russia
0008                 9742           83   Russia
0009                 9672           83   Russia
0010                 9740           83   Russia
0011                 9278           83   Russia
0012                 8447           83   Russia
0013                 9740          106   UK
0014                 9278          106   UK
0015                 9252          124   UK & NI
0016                 9740          110   USA
0017                 8447          108   United States
0018                 9252          110   USA
0019                 9278          110   USA

我要做的是找出哪些报告使用所有相同的国家/地区名称以及这些国家/地区名称是什么?

在上面的示例中,只有报告9278和9740使用波斯尼亚&黑塞哥维那,捷克共和国,俄罗斯,英国和美国。然而,这只是我从能够直观地看到差异时选择的一小部分样本。

输出看起来像?: -

9728                  9740
Bosnia & Herzegovina  Bosnia & Herzegovina
Czech Republic        Czech Republic
Russia                Russia
UK                    UK
USA                   USA

2 个答案:

答案 0 :(得分:0)

以下选择将返回表中再次具有相同CountryName的所有记录,然后将它们分组以忽略ReportCountryID字段:

select ReportID,
       CountryID,
       CountryName
  from ReportCountryTable rpt1
 where exists (select 1
                 from ReportCountryTable rpt2
                where rpt2.ReportCountryID <> rpt1.ReportCountryID
                  and rpt2.CountryName     = rpt1.CountryName) -- or you can use rpt2.CountryID = rpt1.CountryID
 group by ReportID,
          CountryID,
          CountryName
 order by CountryID,
          CountryName

输出与您的数据子集一样,如下所示:

ReportID    CountryID   CountryName
----------- ----------- -----------------------------------------------------------
9278        13          Bosnia & Herzegovina
9740        13          Bosnia & Herzegovina
9278        25          Czech Republic
9740        25          Czech Republic
8447        83          Russia
9278        83          Russia
9672        83          Russia
9714        83          Russia
9740        83          Russia
9742        83          Russia
9278        106         UK
9740        106         UK
9252        110         USA
9278        110         USA
9740        110         USA

答案 1 :(得分:0)

DECLARE @tempTable table
(
  countryID int
)

--Match with five countries as per the example
INSERT INTO @tempTable values 
( 25 ), (13) ,(110) , (106), (83)
--In case you want to match all distinct countries then you can comment above line and use below line.
--INSERT INTO @tempTable 
--SELECT distinct CountryID from Table1

SELECT T1.ReportID FROM
Table1 T1
JOIN ( SELECT countryId from @tempTable ) T2
ON T1.CountryID = T2.countryID
GROUP BY T1.ReportID
HAVING COUNT( DISTINCT  T1.CountryID) = ( SELECT COUNT(countryID) FROM @tempTable)