我已经研究过以前的问题,但找不到复制我的或易于理解的问题。我希望这是一个相对简单的回答,如果我有重复,抱歉。
我在SQL中有一个表格可以对我们的所有报告进行编目(根据下面的简化版本)
它有ReportCountryID
作为主键,ReportID
,CountryID
,CountryName
。
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
答案 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)