Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 比较同一表中的查询结果_Sql Server_Sql Server 2008_Sql Server 2005 - Fatal编程技术网

Sql server 比较同一表中的查询结果

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

RDBMS SQL Server,T-SQL

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

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