一個辦法做到這一點是這樣的
SELECT c.id_device,
c.id_capability,
a.id
FROM #map_device_cap c
JOIN #action a ON c.id_capability = a.id_capability
JOIN #map_device_action ma ON a.id = ma.id_action
AND c.id_device = ma.id_device
UNION
SELECT c.id_device,
c.id_capability,
NULL
FROM #map_device_cap c
LEFT JOIN #map_device_action ma ON c.id_device = ma.id_device
WHERE ma.id_device IS NULL;
完整的腳本,我用我的測試:
IF OBJECT_ID('tempdb..#map_device_cap') IS NOT NULL
DROP TABLE #map_device_cap;
CREATE TABLE #map_device_cap
(id_device INT,
id_capability INT
);
INSERT INTO #map_device_cap
VALUES
(1,
10
);
INSERT INTO #map_device_cap
VALUES
(1,
30
);
INSERT INTO #map_device_cap
VALUES
(1,
40
);
INSERT INTO #map_device_cap
VALUES
(2,
10
);
INSERT INTO #map_device_cap
VALUES
(2,
50
);
INSERT INTO #map_device_cap
VALUES
(3,
20
);
select * from #map_device_cap
IF OBJECT_ID('tempdb..#map_device_action') IS NOT NULL
DROP TABLE #map_device_action;
CREATE TABLE #map_device_action(id_device INT,
id_action INT);
INSERT INTO #map_device_action
VALUES
(1,
100
);
INSERT INTO #map_device_action
VALUES
(1,
200
);
INSERT INTO #map_device_action
VALUES
(1,
300
);
INSERT INTO #map_device_action
VALUES
(2,
400
);
INSERT INTO #map_device_action
VALUES
(2,
500
);
select * from #map_device_action
IF OBJECT_ID('tempdb..#action') IS NOT NULL
DROP TABLE #action;
CREATE TABLE #action(id INT,
id_capability INT);
INSERT INTO #action
VALUES
(100,
10
);
INSERT INTO #action
VALUES
(200,
30
);
INSERT INTO #action
VALUES
(300,
40
);
INSERT INTO #action
VALUES
(400,
10
);
INSERT INTO #action
VALUES
(500,
50
);
SELECT c.id_device,
c.id_capability,
a.id
FROM #map_device_cap c
JOIN #action a ON c.id_capability = a.id_capability
JOIN #map_device_action ma ON a.id = ma.id_action
AND c.id_device = ma.id_device
UNION
SELECT c.id_device,
c.id_capability,
NULL
FROM #map_device_cap c
LEFT JOIN #map_device_action ma ON c.id_device = ma.id_device
WHERE ma.id_device IS NULL;
更新查詢,以滿足您的需求:
SELECT c.id_device,
c.id_capability,
a.id
FROM map_device_cap c
JOIN action a ON c.id_capability = a.id_capability
JOIN map_device_action ma ON a.id = ma.id_action
AND c.id_device = ma.id_device
UNION
SELECT c.id_device,
c.id_capability,
NULL
FROM map_device_cap c
LEFT JOIN map_device_action ma ON c.id_device = ma.id_device
WHERE ma.id_device IS NULL
UNION
SELECT c.id_device,
c.id_capability,
NULL
FROM map_device_cap c
LEFT JOIN action a ON c.id_capability = a.id_capability
WHERE a.id_capability IS NULL;
請從「操作」表中提供的數據也是如此。 –
我提供了它們,但僅供提醒: action.id:100,200,300,400,500,action.id_capability:10,30,40,10,50 – Forbinn