Mysql 如何使用空值将表与其自身连接起来
我有一个表格测试:Mysql 如何使用空值将表与其自身连接起来,mysql,sql,join,Mysql,Sql,Join,我有一个表格测试: +----+---------+-----+---+ | ID | Name | A | B | +----+---------+-----+---+ | 1 | Steve | 200 | 0 | | 2 | Steve | 200 | 1 | | 5 | James | 90 | 0 | | 4 | James | 50 | 1 | | 3 | Warrick | 100 | 1 | +----+---------+-----+--
+----+---------+-----+---+
| ID | Name | A | B |
+----+---------+-----+---+
| 1 | Steve | 200 | 0 |
| 2 | Steve | 200 | 1 |
| 5 | James | 90 | 0 |
| 4 | James | 50 | 1 |
| 3 | Warrick | 100 | 1 |
+----+---------+-----+---+
此SQL查询:
SELECT one.Name as Name, one.A as one_value, zero.A as zero_value
FROM test one LEFT JOIN test zero ON one.Name = zero.Name AND one.A <> zero.A
WHERE zero.B = 0 AND one.B = 1
但我想要的是,当一条记录只存在于B=1的情况下,它将包含在响应中,并带有一个空值或零值列中的某个内容,如下所示:
+---------+-----------+------------+
| Name | one_value | zero_value |
+---------+-----------+------------+
| James | 50 | 90 |
| Warrick | 100 | NULL |
+---------+-----------+------------+
我该怎么做
编辑:
我算出了:
SELECT one.Name, one.A, zero.A
FROM test one LEFT JOIN test zero ON one.Name = zero.Name AND ( zero.B = 0 OR zero.B is NULL )
WHERE ( one.A <> zero.A OR zero.A is null )
由于左连接,0.B的值可能为NULL,因此需要扩展WHERE条件:
WHERE one.B=1 AND (zero.B IS NULL OR zero.B = 0)
使现代化
您还应将分数条件下移到以下位置:
WHERE one.B=1 AND (zero.B IS NULL OR zero.B = 0)
AND (zero.A IS NULL OR one.A <> zero.A)
这个怎么样
select Name ,
(case when B= 0 Then A else null) as zero_value,
(case when B= 1 Then A else null) as one_value
from test
左连接在这里是一件好事,这是您想要的:
SELECT
one.Name
,one.A as one_value
, zero.A as zero_value
FROM test one
LEFT JOIN test zero
on one.Name = zero.Name
and zero.B = 0
where one.B = 1
也许您希望处理记录仅存在于B=0时,同时在一个值列中包含一个空值的响应中:
SELECT
test.Name
, one.A as one_value
, zero.A as zero_value
FROM
( SELECT Name
FROM test
GROUP BY Name) test
LEFT JOIN test one
on test.Name = one.Name
and one.B = 1
LEFT JOIN test zero
on test.Name = zero.Name
and zero.B = 0
尝试为u提供精确结果的thiz查询
选择Test.nme,
1.A作为1_值,
零。A为零_值
FROMSELECT name AS nme FROM test WHERE name NOT in SELECT one.name FROM test one LEFT JOIN test zero ON one.name=zero.name AND one.A=zero.A
其中0.B=0,1.B=1按名称分组测试
在test.nme=one.Name和one.B=1上左连接test-one
在test.nme=zero.Name和zero.B=0上左连接test zero 这也会返回一个不需要的Steve行,其中一个值=200,零个值=NULL。@user3341880嗯,是的,这是另一种问题。。与您的加入条件有关;将分数条件移动到何处可以解决此问题。我不确定是否遵循。如果我使用了不正确的连接,请纠正我。谢谢。尝试此操作。从测试一中选择一个.Name作为Name,一个.A作为one_值,零.A作为zero_值,将测试零连接到one.Name=zero.Name和one.A zero.A,其中zero.B=0或zero.B为NULL,one.B=1或one.B为NULL;这正是我不想看到的,当我观看SQL查询时,你有2个子查询性能杀手和1个不在不同的是不好在这里被要求。这是不可读、不可扩展和不可维护的。你真的是oracle认证的吗?哈哈,好吧,因为你的头像图标^^看看我的答案,看看如何避免子查询:
SELECT
test.Name
, one.A as one_value
, zero.A as zero_value
FROM
( SELECT Name
FROM test
GROUP BY Name) test
LEFT JOIN test one
on test.Name = one.Name
and one.B = 1
LEFT JOIN test zero
on test.Name = zero.Name
and zero.B = 0