![](/img/trans.png)
[英]How can I apply a condition to multiple rows using SQL? CASE WHEN / PARTITION OVER
[英]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 JOIN
与special
表一起使用才能获得不匹配的行。
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.