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

3hvapo4f  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(286)

我很难弄清楚如何获得以下查询结果:
让我向您展示我使用的表结构和查询。我想我很快就能搞定,但我需要一些帮助来找出问题所在:
以下是我的表格:

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\ U代码应该只在特殊表中有匹配项时显示,否则应该为空。有人知道我做错了什么吗?非常感谢

mnowg1ta

mnowg1ta1#

使用 tbl5.spe_code 而不是 tbl1.ord_codeSELECT 列表。当没有对手时 LEFT JOIN 会回来的 NULL 对于中的所有列 special table。
您还需要更改在连接中使用的列 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;

演示

相关问题