Sql server 比较同一表中的查询结果
RDBMS SQL Server,T-SQL 考虑一个表,该表链接了两个不同表中的信息:文章和类别。此表包含每个文章的一个或多个条目,其中包含该文章所属类别的ID。因此,Sql server 比较同一表中的查询结果,sql-server,sql-server-2008,sql-server-2005,Sql Server,Sql Server 2008,Sql Server 2005,RDBMS SQL Server,T-SQL 考虑一个表,该表链接了两个不同表中的信息:文章和类别。此表包含每个文章的一个或多个条目,其中包含该文章所属类别的ID。因此, SELECT * FROM TABLE WHERE ARTICLEID = X 返回1到n个结果 我希望建立一个查询,使我能够比较的文章有完全相同的类别组合。我一直在尝试使用INTERSECT,但它没有返回任何行。例如: ARTICLEID CATEGORYID 1 1 1 2 1 4
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,等等
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
我确信这个查询有一些漏洞,但这应该给你们一个起点
编辑:根据问题的最后部分更正加入。第一次没有看到它。编辑:这应该可以
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即可。它应该能用。你试过加入吗
试试这个。如果一切都是整数
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、mn顺序按articleid划分行数。这将为您提供数据。这是最终有效的代码: temp为select a.*,b.articleid为sameAs,1为cnt from articletags a left join articletags b on a.tagID=b.tagID其中a.articleid=XXX从articleid in select sameAs中的articleid中的articleid中选择*从temp where sameAsarticleid按sameAs分组,sumcnt=select count*从articletags中选择articleid=XXX
XXX是传入的ArticleID。结果是一组记录共享与ArticleID相同的ArticleTag 你能给我们看一下你尝试过的查询吗?看,我尝试过很多其他方法,从articletags中选择TagID,其中articleid=166相交,从articletags中选择TagID作为articletags_1,其中ArticleID166如果我读对了,这将返回categoryID相同且类别数相同的任何记录集。我理解这种方法,但查询不会在我的表上返回任何结果。是的……没有表来测试它,我犯了一些错误。我已经编辑了这个查询,我认为这个版本应该可以用。不管怎样,你都理解这个方法,所以如果它不起作用,你可以做一些编辑,应该这样做。have fun~返回多部分标识符a.articleid找不到。啊,找到了。最后一个a.articleid=XXX应该改为直接读取articleid。谢谢。我不太明白。查询不返回任何结果,而您在a中丢失了我。Categoryid为null。这适用于具有两个表的场景。我的场景涉及一个表;基本上是一组值1-n。从文章中选择distinctcategoryid?我认为您完全没有抓住要点。谢谢你的努力。
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