Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用空值将表与其自身连接起来_Mysql_Sql_Join - Fatal编程技术网

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