cat_ID与cat_subcat匹配并包含空值的类别表

时间:2019-02-19 16:01:41

标签: mysql database

cat_ID | cat_Name | Cat_SubCat
1 |相机| 17
2 |对讲机| 17
3 |电视| 20
4 |厨房电器| 19
5 |扬声器| 20
6 |智能恒温器| 19
7 |智能插座| 18
8 |自动割草机| 17
9 |智能手机| 21
11 |智能真空吸尘器| 19
12 |智能手表| 21
13 |智能锁| 17
14 |智能门铃| 17
15 |智能灯开关| 18
17 |安全/户外| NULL
18 |灯具NULL
19 |家用NULL
20 |娱乐| NULL
21 |可穿戴| NULL
 

所以我有一个名为Category的表,其列名为:cat_ID; cat_Name;和cat_SubCat;我试图获取所有具有null(标题)的类别行以打印其他行,并找到相关的cat_ID(标题下的子类别)

desired outcome

cat_ID | cat_Name | Cat_SubCat
17 |安全/户外|空
1 |相机| 17
2 |对讲机| 17
9 |机器人割草机| 17
13 |智能锁| 17
14 |智能门铃| 17
18 |灯具空
7 |智能插座| 18
15 |智能开关| 18
19 | HouseHold |空
4 |厨房电器| 19
6 |智能恒温器| 19
11 |智能疫苗| 19
20 |娱乐|空
3 |电视| 20
5 |讲者| 20
21 |可穿戴|空
10 |智能手机21
12 |智能手表21

4 个答案:

答案 0 :(得分:1)

如果我对问题的理解正确,那么您要:

  • 获取为空的值
  • 为空值获取ID,如果这些想法是子类别,则也可以获取这些类别

利用子查询,这应该可以实现您的目标。我们首先获取所有ID为空的ID,然后检查以最终获取所有值,前提是这些ID为一个子类别,或者该子类别根本为空。

CREATE OR REPLACE PROCEDURE country_demographic (p_country_name IN countries.country_name%TYPE)
IS
TYPE ED_TYPE IS TABLE OF countries%ROWTYPE;
p_country_demo_rec ED_TYPE;
BEGIN
SELECT * BULK COLLECT INTO p_country_demo_rec FROM countries
WHERE country_name = p_country_name;
FOR i IN p_country_demo_rec.FIRST..p_country_demo_rec.LAST
LOOP
DBMS_OUTPUT.PUT_LINE('Country Name:'||p_country_demo_rec(i).country_name ||
    'Location:' || p_country_demo_rec(i).location ||
    'Capitol:' || p_country_demo_rec(i).capitol ||
    'Population:' || p_country_demo_rec(i).population ||
    'Airports:' || p_country_demo_rec(i).airports ||
    'Climate:' || p_country_demo_rec(i).climate );
END LOOP;
IF SQL%NOTFOUND THEN
    RAISE_APPLICATION_ERROR(-20201, 'This country does not exist.');
END IF;
END;

答案 1 :(得分:1)

由于您的层次结构只有一层,因此您可以这样做:

ORDER BY COALESCE(cat_id, cat_subcat) ASC 

在您现有的SQL上。

如果您的层次结构不止一个,那么您将需要进行递归CTE,以在新列中建立顺序并以此顺序进行排序。

答案 2 :(得分:0)

以这种方式尝试

SQL Fiddle

MySQL 5.6模式设置

CREATE TABLE Table1
    (`cat_ID` int, `cat_Name` varchar(20), `Cat_SubCat` varchar(4))
;

INSERT INTO Table1
    (`cat_ID`, `cat_Name`, `Cat_SubCat`)
VALUES
    (1, 'cameras', '17'),
    (2, 'intercoms', '17'),
    (3, 'televisions', '20'),
    (4, 'kitchen appliances', '19'),
    (5, 'speakers', '20'),
    (6, 'smart thermostat', '19'),
    (7, 'smart outlets', '18'),
    (8, 'robotic lawn mowers', '17'),
    (9, 'smartphones', '21'),
    (11, 'smart vaccums', '19'),
    (12, 'smartwatches', '21'),
    (13, 'smart locks', '17'),
    (14, 'smart doorbell', '17'),
    (15, 'smart light switches', '18'),
    (17, 'Security/Outdoors', NULL),
    (18, 'Lamps & Lights', NULL),
    (19, 'Household', NULL),
    (20, 'Entertainment', NULL),
    (21, 'Wearables', NULL)
;

查询1

select 
  t2.cat_ID,
  t2.cat_Name,
  t2.Cat_SubCat
from table1 t2
left join table1 t1
  on t2.Cat_SubCat = t1.cat_id
where t1.Cat_Subcat is null
order by Coalesce(t2.cat_subcat, t2.cat_Id-0.01)

Results

| cat_ID |             cat_Name | Cat_SubCat |
|--------|----------------------|------------|
|     17 |    Security/Outdoors |     (null) |
|      1 |              cameras |         17 |
|     13 |          smart locks |         17 |
|     14 |       smart doorbell |         17 |
|      8 |  robotic lawn mowers |         17 |
|      2 |            intercoms |         17 |
|     18 |       Lamps & Lights |     (null) |
|     15 | smart light switches |         18 |
|      7 |        smart outlets |         18 |
|     19 |            Household |     (null) |
|     11 |        smart vaccums |         19 |
|      6 |     smart thermostat |         19 |
|      4 |   kitchen appliances |         19 |
|     20 |        Entertainment |     (null) |
|      5 |             speakers |         20 |
|      3 |          televisions |         20 |
|     21 |            Wearables |     (null) |
|      9 |          smartphones |         21 |
|     12 |         smartwatches |         21 |

答案 3 :(得分:0)

Simonare谢谢+1
选择
  t2.cat_ID,
  t2.cat_Name,
  t2.Cat_SubCat
来自table1 t2
左联接表1 t1
  在t2.Cat_SubCat = t1.cat_id
其中t1.Cat_Subcat为空
通过Coalesce排序(t2.cat_subcat,t2.cat_Id-0.01)