2012-07-18 30 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相同的文章標籤的記錄。