2016-08-31 33 views
0

我不是一個在數據庫中工作很多的人,所以答案很簡單,但我無法找到它。 這裏是我的數據庫的簡化版本(這是在SQLITE BTW): database imageSQL:加入多個不同大小的表格

我在我的數據庫中的以下值(我只把ID這裏,因爲只有它們是相關的):

  • device.id:1,2,3
  • capability.id:10,20,30,40,50
  • action.id:100,200,300,400,500
  • action.id_capability :10,30, 40,10,50

在這裏是在map_device_cap條目:

  • 1,10
  • 1,30
  • 1,40
  • 2,10
  • 2, 20
  • 2,50
  • 3,20 20

條目中map_device_action:

  • 1,100
  • 1,200
  • 1,300
  • 2,400
  • 2,500

現在我想要創建SELECT請求那個組表map_device_cap和map_device_action。在這種情況下,結果將是:

  • 1,10,100
  • 1,30,200
  • 1,40 300
  • 2,10,400
  • 2,20,空
  • 2,50,500
  • 3,20,空

注意:表map_device_cap將始終大於map_device_action。

我第一次嘗試以下要求:

SELECT map_device_cap.id_device, map_device_cap.id_capability, 
     map_device_action.id_action 
FROM map_device_cap NATURAL LEFT JOIN map_device_action 

但這一要求給我的結果如下:

  • 1,10,100
  • 1,10,200
  • 1,10,300
  • 1,30,100
  • 1,30,200
  • 1,30,300
  • 1,40 100
  • 1,40 200
  • 1,40 300
  • 2,10,400
  • 2,10,500
  • 2,20,400
  • 2,20,500
  • 2,50,400
  • 2,50,500
  • 3,20,null

正如你所看到的那樣,有重複的條目,我不知道如何刪除它們。

如果有人有想法或需要更多信息,請告訴我。

問候

+0

請從「操作」表中提供的數據也是如此。 –

+0

我提供了它們,但僅供提醒: action.id:100,200,300,400,500,action.id_capability:10,30,40,10,50 – Forbinn

回答

1

試試這個

SELECT mdc.id_device, 
     mdc.id_capability, 
     (SELECT (mda.id_action) 
     FROM action a 
     JOIN map_device_action mda 
       ON a.id_capability = mdc.id_capability 
       AND a.id = mda.id_action 
       AND mda.id_device = mdc.id_device 
     ) as a 
FROM map_device_cap mdc 
ORDER BY mdc.id_device, mdc.id_capability; 
1

一個辦法做到這一點是這樣的

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; 
+0

此解決方案在設備擁有2個功能時不起作用但只有1個動作(map_device_cap用於device.id = x返回2個條目,但map_device_action用於device.id = x返回1條目)。 謝謝你的幫助。這幾乎是完美的 – Forbinn

+0

我只是更新我的例子,然後你可以很容易地看到它自己 – Forbinn

+0

查看更新的查詢 –