我想(在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
的樣本數據是偉大的,但不要忘了給我們預期的效果呢! – jarlh
'COUNT()'與'GROUP BY'應該有幫助 –
@jarlh,結果必須返回C1和C2。 –