1

RDBMS SQL サーバー、T-SQL

Articles と Categories という 2 つの異なるテーブルの情報をリンクするテーブルを考えてみましょう。このテーブルには、記事ごとに、記事が属するカテゴリの ID を含む 1 つまたは複数のエントリが含まれます。したがって、

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

for のクエリはARTICLEID = 13 と 5 を返し、forARTICLEID = 3は 1 と 5 を返す必要があります。

4

5 に答える 5

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

1行でそれらが必要な場合は、cteに参加する必要はありませんが、代わりに記事IDによるcnt、sm、mx、mn順で行番号パーティションを試してください..これにより、データが得られます..

于 2012-07-18T17:05:23.390 に答える
0

これは最終的に機能したコードです:

with temp as (select a.*, b.articleid as sameAs, 1 as cnt from articletags a left join articletags b on a.tagID=b.tagID where a.articleid=XXX ) select * from Articles where ArticleID in (select sameAs from temp where sameAs<>articleid group by sameAs has sum(cnt) = (select count(*) from articletags where articleid=XXX)))

XXX は渡された ArticleID です。結果は、ArticleID の記事タグと同じ記事タグを共有する一連のレコードです。

于 2012-07-18T23:58:13.390 に答える
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

クエリにはいくつかの穴があると確信していますが、それが出発点になるはずです。

編集:質問の最後の部分ごとに結合を修正しました。(最初は見れませんでした。)

于 2012-07-18T16:32:40.253 に答える
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 に変更します。それはうまくいくはずです。

于 2012-07-18T16:33:30.920 に答える
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
于 2012-07-18T16:36:19.873 に答える