2017-10-11 78 views
0

我需要一些幫助來完成sql查詢。我有兩個表,計算機和產品由ComputerProduct連接。現在我想知道是否有任何計算機具有相同的產品主要名稱和備用名稱。對以下數據運行查詢將返回c1和c2。 如何避免表內的重複?在相關表格中查找重複內容

Computer 
----------------------- 
Id Name  
c1 computer1 
c2 computer1 
c3 computer2 

ComputerProduct 
----------------------- 
ComputerId ProductId 
c1   p1 
c1   p2 
c2   p1 
c2   p2 
c3   p1 
c3   p2 

Product 
----------------------- 
Id Name  Type 
p1 A1   Primary 
p2 a1010  Secondary 
+1

的樣本數據是偉大的,但不要忘了給我們預期的效果呢! – jarlh

+0

'COUNT()'與'GROUP BY'應該有幫助 –

+0

@jarlh,結果必須返回C1和C2。 –

回答

0

我想(在MSSQL )像下面這樣的查詢(也許它可以被簡化...)。

在內部查詢中,使用'Primary'和'Secondary'類型的兩個連接來提取所有組合。

然後使用computer.name和產品名稱對記錄進行分組和計數。 'HAVING COUNT(*)> 1'僅提取所需的記錄,即具有相同的計算機名稱和產品名稱。

最後,只提取與提取的computer.name(s)和產品名稱對應的ID。

SELECT X.ID 
FROM COMPUTER X 
INNER JOIN COMPUTERPRODUCT Y1 ON X.ID=Y1.COMPUTERID 
INNER JOIN COMPUTERPRODUCT Y2 ON X.ID=Y2.COMPUTERID 
INNER JOIN PRODUCT Z1 ON Y1.PRODUCTID = Z1.ID AND Z1.[TYPE] ='Primary' 
INNER JOIN PRODUCT Z2 ON Y2.PRODUCTID = Z2.ID AND Z2.[TYPE] ='Secondary' 
WHERE EXISTS (SELECT 1 
       FROM (SELECT A.NAME, C1.NAME AS C1_NAME, C2.NAME AS C2_NAME, COUNT(*) AS RC 
         FROM COMPUTER A 
         INNER JOIN COMPUTERPRODUCT B1 ON A.ID=B1.COMPUTERID 
         INNER JOIN COMPUTERPRODUCT B2 ON A.ID=B2.COMPUTERID 
         INNER JOIN PRODUCT C1 ON B1.PRODUCTID = C1.ID AND C1.[TYPE]='Primary' 
         INNER JOIN PRODUCT C2 ON B2.PRODUCTID = C2.ID AND C2.[TYPE]='Secondary' 
         GROUP BY A.NAME, C1.NAME, C2.NAME 
         HAVING COUNT(*) >1 
        ) E WHERE X.NAME = E.NAME AND Z1.NAME =C1_NAME AND Z2.NAME =C2_NAME); 

的樣本數據:

INSERT INTO COMPUTER VALUES ('c1','computer1'); 
INSERT INTO COMPUTER VALUES ('c2','computer1'); 
INSERT INTO COMPUTER VALUES ('c3','computer3'); 
INSERT INTO COMPUTER VALUES ('c4','computer1'); 

INSERT INTO COMPUTERPRODUCT VALUES ('c1','p1'); 
INSERT INTO COMPUTERPRODUCT VALUES ('c1','p2'); 
INSERT INTO COMPUTERPRODUCT VALUES ('c2','p1'); 
INSERT INTO COMPUTERPRODUCT VALUES ('c2','p2'); 
INSERT INTO COMPUTERPRODUCT VALUES ('c3','p1'); 
INSERT INTO COMPUTERPRODUCT VALUES ('c3','p2'); 
INSERT INTO COMPUTERPRODUCT VALUES ('c4','p1'); 
INSERT INTO COMPUTERPRODUCT VALUES ('c4','p3'); 

INSERT INTO PRODUCT VALUES ('p1','A1','Primary'); 
INSERT INTO PRODUCT VALUES ('p2','a1010','Secondary'); 
INSERT INTO PRODUCT VALUES ('p3','b2020','Secondary'); 

輸出:

ID 
c1 
c2 
1

我最近處理過同樣的問題。

MySQL有能力使表不接受重複的表。

你可以改變你的表,刪除重複的值。

ALTER TABLE ComputerProduct 
ADD UNIQUE (ComputerID); 

重要提示:複製你的表之前,它搞亂,所以你不要冒險丟失任何數據...

一切順利,好運, CrypticPug

1
with dat 
as (select c.id,c.name, p.prodtype,p.prodname 
    from computer c join computerProduct cp on c.id = cp.computerId 
        join product p on cp.productId = p.id) 
select * from computer 
where name in 
(
    select name from (select id,name,prodname from dat where prodtype='Primary')x 
    group by name 
    having count(*)>1 
    intersect 
    select name from (select id,name,prodname from dat where prodtype='Secondary')x 
    group by name 
    having count(*)>1 
)