繁体   English   中英

当条件不适用于多行结果时如何获取 null 列

[英]How to get null column when condition doesn't apply with multiple rows results

我很难弄清楚如何获得以下查询结果:

让我向您展示我正在使用的表结构和查询。 我认为已经接近正确,但我需要一些帮助来找出问题所在:

这是我的表:

CREATE TABLE `manager` (
  `man_id` int(11) NOT NULL AUTO_INCREMENT,
  `man_firtname` varchar(20) NOT NULL,
  `man_lastname` varchar(20) NOT NULL,
  PRIMARY KEY (`man_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

man_id  man_firtname    man_lastname
1       Albert          Einstein

CREATE TABLE `orders` (
  `ord_id` int(11) NOT NULL AUTO_INCREMENT,
  `ord_orderno` varchar(12) NOT NULL,
  `ord_man_id` int(11) NOT NULL,
  `ord_total` decimal(11,0) NOT NULL,
  `ord_code` varchar(10) NOT NULL,
  PRIMARY KEY (`ord_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ord_id  ord_orderno ord_man_id  ord_total   ord_code
1       ABCDE       1           160         FFFBBB


CREATE TABLE `orders_items` (
  `ori_id` int(11) NOT NULL AUTO_INCREMENT,
  `ori_ord_id` int(11) NOT NULL,
  `ori_item_code` varchar(10) NOT NULL,
  `ori_name` varchar(40) NOT NULL,
  `ori_desc` varchar(80) NOT NULL,
  PRIMARY KEY (`ori_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


ori_id  ori_ord_id  ori_item_code   ori_name    ori_desc
1       1           JO123           JohnyT      This is a test description
2       1           KK234           SprayC      Spray test description


CREATE TABLE `proda` (
  `pra_id` int(11) NOT NULL AUTO_INCREMENT,
  `pra_code` varchar(10) NOT NULL,
  `pra_name` varchar(40) NOT NULL,
  PRIMARY KEY (`pra_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


pra_id  pra_code    pra_name
1       JO123       JohnyT


CREATE TABLE `prodb` (
  `prb_id` int(11) NOT NULL AUTO_INCREMENT,
  `prb_code` varchar(10) NOT NULL,
  `prb_name` varchar(40) NOT NULL,
  PRIMARY KEY (`prb_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


prb_id  prb_code    prb_name
1       KK234       SprayC

CREATE TABLE `special` (
  `spe_id` int(11) NOT NULL AUTO_INCREMENT,
  `spe_man_id` int(11) NOT NULL,
  `spe_code` varchar(10) NOT NULL,
  PRIMARY KEY (`spe_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


spe_id  spe_man_id  spe_code    spe_item_code
1       1           FFFBBB      JO123

这是我的查询:

SELECT 
    tbl1.ord_id, 
    UPPER(tbl1.ord_orderno) As ord_orderno, 
    tbl1.ord_total, 
    tbl1.ord_code, 
    tbl2.ori_id,
    tbl2.ori_item_code,
    tbl3.pra_name,
    tbl4.prb_name
  FROM
    orders tbl1
  JOIN
    orders_items tbl2
  ON
    tbl1.ord_id=tbl2.ori_ord_id
  LEFT JOIN
    proda tbl3
  ON
    tbl2.ori_item_code=tbl3.pra_code
  LEFT JOIN
    prodb tbl4
  ON
    tbl2.ori_item_code=tbl4.prb_code
  JOIN
    special tbl5
  ON
    tbl1.ord_code=tbl5.spe_code
  WHERE 
       tbl1.ord_code IN (SELECT spe_code FROM special JOIN manager ON man_id=1) 
  AND
        tbl1.ord_id=1; 

这是我得到的结果:

ord_id  ord_orderno ord_total   ord_code    ori_id  ori_item_code   pra_name    prb_name
1       ABCDE       160         FFFBBB      1       JO123           JohnyT  
1       ABCDE       160         FFFBBB      2       KK234           SprayC

我想得到什么?

ord_id  ord_orderno ord_total   ord_code    ori_id  ori_item_code   pra_name    prb_name
1       ABCDE       160         FFFBBB      1       JO123           JohnyT  
1       ABCDE       160         NULL        2       KK234           SprayC

基本上,ord_code 应该只在特殊表中有匹配时显示,否则应该是 null。 有人知道我做错了什么吗? 太感谢了

SELECT列表中使用tbl5.spe_code而不是tbl1.ord_code 当没有匹配时, LEFT JOIN将为special表中的所有列返回NULL

您还需要使用special更改您在联接中使用的列。 它应该是tbl2.ori_item_code = tbl5.spe_item_code

并且您需要将LEFT JOINspecial表一起使用才能获得不匹配的行。

SELECT 
    tbl1.ord_id, 
    UPPER(tbl1.ord_orderno) As ord_orderno, 
    tbl1.ord_total, 
    tbl5.spe_code, 
    tbl2.ori_id,
    tbl2.ori_item_code,
    tbl3.pra_name,
    tbl4.prb_name
  FROM
    orders tbl1
  JOIN
    orders_items tbl2
  ON
    tbl1.ord_id=tbl2.ori_ord_id
  LEFT JOIN
    proda tbl3
  ON
    tbl2.ori_item_code=tbl3.pra_code
  LEFT JOIN
    prodb tbl4
  ON
    tbl2.ori_item_code=tbl4.prb_code
  LEFT JOIN
    special tbl5
  ON
    tbl2.ori_item_code=tbl5.spe_item_code
  WHERE 
       tbl1.ord_code IN (SELECT spe_code FROM special JOIN manager ON man_id=1) 
  AND
        tbl1.ord_id=1; 

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM