2012-07-18 29 views
1

RDBMS SQL Server,T-SQL比较来自同一表内的查询结果

考虑一个链接两个不同表的信息的表:文章和类别。此表包含每条第1条或多条包含该文章所属类别的ID的条目。因此,a

SELECT * FROM TABLE WHERE ARTICLEID = X 

返回1到n的结果。

我期待建立一个查询,它允许我比较具有完全相同的类别组合的文章。我一直在尝试使用INTERSECT,但不会返回任何行。一个例子:

ARTICLEID CATEGORYID 

    1 1 
    1 2 
    1 4 
    2 1 
    2 4 
    3 1 
    3 2 
    3 4 
    4 2 
    4 4 
    5 1 
    5 2 
    5 4 

ARTICLEID = 1用于查询应返回图3和图5,用于ARTICLEID = 3应该返回图1和5,等等。

+0

你能告诉我们你试过的查询吗? – 2012-07-18 16:16:57

+0

请参阅[正确的关系部门与集合](http://weblogs.sqlteam.com/peterl/archive/2010/07/02/Proper-Relational-Division-With-Sets.aspx) – 2012-07-18 16:19:31

+0

我试过了(在许多其他事情)从articletags中选择TagID,其中articleid = 166 INTERSECT从articletags中选择TagID作为articletags_1 where articleid <> 166 – 2012-07-18 16:49:33

回答

0

编辑:这应该工作

with temp as 
(
    select a.*, b.articleid as bart, 1 as cnt from tableName a left join 
    tableName b on a.CATEGORYID=b.CATEGORYID where a.articleid=XXX 
) 
select bart from temp where bart<>articleid group by bart having sum(cnt) = 
(select count(*) from tableName where articleid=XXX) 

只要运行这个确切的查询,只改变XXX到您需要匹配任何条款ArticleID。它应该工作。

+0

如果我正确读取此内容,则会返回categoryID相同且类别数相同的任何记录集。我理解这种方法,但查询在我的表上没有返回任何结果。 – 2012-07-18 16:47:01

+0

叶......没有一张表来测试它,我犯了一些错误。我编辑了查询,我认为这个版本应该可以工作。 – 2012-07-18 16:48:25

+0

无论哪种方式,你都明白这个方法,所以如果它不起作用,你可以做一些编辑,它应该。玩得开心〜 – 2012-07-18 16:50:12

0
SELECT ART.ID, 
      ART.COLUMN2, 
      ART.COLUMN3, 
      CAT.ID, 
      CAT.COLUMN2, 
      CAT.COLUMN3, 
      ART_CAT.CAT_ID 
    FROM ARTICLE ART, 
      CATEGORY CAT, 
      ARTICLE_CATEGORY ART_CAT 
    WHERE ART.ID = 1 
      ART_CAT.CAT_ID = ART.ID 

我敢肯定,查询有一些漏洞,但应该给你一个出发点。

编辑:更正你的问题的最后一部分的连接。 (没看到它的第一次左右。)

0

你试过Right Join

create table category 
(
    Categoryid int 
) 

insert into category(Categoryid)values(1) 
insert into category(Categoryid)values(2) 
insert into category(Categoryid)values(3) 
insert into category(Categoryid)values(4) 
insert into category(Categoryid)values(5) 

create table articles 
(
    Articleid int, 
    Categoryid int 
) 

insert into articles(Articleid, Categoryid)values(1, 1) 
insert into articles(Articleid, Categoryid)values(1, 2) 
insert into articles(Articleid, Categoryid)values(1, 4) 
insert into articles(Articleid, Categoryid)values(2, 1) 
insert into articles(Articleid, Categoryid)values(2, 4) 

Select c.Categoryid 
From 
(
    Select * from articles where Articleid = 2 
)a 
right Join category c on c.Categoryid = a.Categoryid 


drop table articles 
drop table category 
+0

我不确定我是否遵循这一点。该查询返回没有结果,并且您在a.Categoryid为空时丢失了我。 – 2012-07-18 16:48:03

+0

对不起我的错误。请检查更新。 – 2012-07-18 16:49:34

+1

这适用于有两个表的场景。我的场景涉及单个表格。 – 2012-07-18 16:59:16

0

试试这个,如果一切都是整数。

with mycte as 
(
select articleid,count(*) as cnt,sum(categoryid) as sm,max(categoryid) mx,min(categoryid) mn 
from mytable 
group by articleid 
) 
select mc.articleid,mc1.articleid from mycte mc inner join mycte mc1 on mc.sm = mc1.sm 
and mc.mn = mc1.mn 
and mc.mx = mc1.mx 
and mc.cnt = mc1.cnt 
and mc.articleid <> mc1.articleid 

如果你需要他们在同一行,那么你就不需要参加CTE而是由CNT,SM,MX尝试行号分区,由articleid..This mn个订单将会给你的数据..

0

这是最终的工作代码:

与温度为(选择*,b.articleid为sameAs的,1从articletags CNT左连接articletags b关于a.tagID = b.tagID哪里a.articleid = XXX)select * from Article where ArticleID in(select sameAs from temp where sameAs <> articleid group by sameAs having sum(cnt)=(select count(*)from articletags where articleid = XXX)))

XXX是传入的ArticleID。结果是一组共享与ArticleID相同的文章标签的记录。