Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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
Sql 如何连接选择匹配和不匹配记录的表?_Sql_Join - Fatal编程技术网

Sql 如何连接选择匹配和不匹配记录的表?

Sql 如何连接选择匹配和不匹配记录的表?,sql,join,Sql,Join,我有一些表格可以计算不同日期的某个动作。我正在尝试加入这些表,以显示每种类型的操作和每天的计数。如果这两天都发生了,那就好了。但如果我有一个只发生在第一天或第二天的动作,我也会喜欢 我尝试过不同类型的联接和联合,但似乎无法让它显示预期的结果 在表1和表2中,前四列根据pl&sta(我想连接的两个字段)匹配,因此我应该从两个表中获得计数,如结果所示。然而,表1有一个是414-1PL,计数为26,表2有41M-2PL,计数为12。我希望在pl和sta字段中返回每个不匹配的数据,并在该列下显示该天数的

我有一些表格可以计算不同日期的某个动作。我正在尝试加入这些表,以显示每种类型的操作和每天的计数。如果这两天都发生了,那就好了。但如果我有一个只发生在第一天或第二天的动作,我也会喜欢

我尝试过不同类型的联接和联合,但似乎无法让它显示预期的结果

在表1和表2中,前四列根据pl&sta(我想连接的两个字段)匹配,因此我应该从两个表中获得计数,如结果所示。然而,表1有一个是414-1PL,计数为26,表2有41M-2PL,计数为12。我希望在pl和sta字段中返回每个不匹配的数据,并在该列下显示该天数的计数

表数据:

Table 1 pl | sta | count_1 ----+-----+-------- 410 | 1PL | 7777 410 | MPL | 31 412 | 1PL | 67 412 | 3PL | 1 414 | 1PL | 26 表1 pl | sta | count|U 1 ----+-----+-------- 410 | 1PL | 7777 410 | MPL | 31 412 | 1PL | 67 412 | 3PL | 1 414 | 1PL | 26 表2 pl | sta | count|U 2 ----+-----+-------- 410 | 1磅| 7000 410 | MPL | 26 412 | 1PL | 52 412 | 3PL | 1 41M | 2PL | 12 结果 pl | sta |计数| 1 |计数| 2 ----+-----+---------+-------- 410 | 1PL | 7777 | 7000 410 | MPL | 31 | 26 412 | 1PL | 67 | 52 412 | 3PL | 1 | 1 414 | 1PL | 26 | 0 41M | 2PL | 0 | 12
我认为您需要一个完整的连接和合并:

SELECT COALESCE(t1.pl, t2.pl) AS pl
    , COALESCE(t1.sta, t2.sta) AS sta
    , COALESCE(t1.count_1, 0) AS count_1
    , COALESCE(t2.count_2, 0) AS count_2
FROM t1
FULL JOIN t2 ON t1.pl = t2.pl AND COALESCE(t1.sta, -99) = COALESCE(t2.sta, -99)

为了解释sta为空的情况,请将sta替换为-99或其他一些无效的值。

我认为您需要一个完全连接和合并:

SELECT COALESCE(t1.pl, t2.pl) AS pl
    , COALESCE(t1.sta, t2.sta) AS sta
    , COALESCE(t1.count_1, 0) AS count_1
    , COALESCE(t2.count_2, 0) AS count_2
FROM t1
FULL JOIN t2 ON t1.pl = t2.pl AND COALESCE(t1.sta, -99) = COALESCE(t2.sta, -99)

为了解释sta为空的情况,请将sta替换为-99或其他无效值。

您可以尝试完全外部联接 例如:


从tableA.pl=tableB.pl上的tableA完全外部联接tableB中选择*您可以尝试完全外部联接 例如:


在标准SQL中,从tableA.pl=tableB.pl上的tableA完全外部联接tableB中选择*。为此,我建议使用
using
子句:

select pl, sta,
       coalesce(t1.count_1, 0) as count_1,
       coalesce(t2.count_2, 0) as count_2
from t1 full join
     t2
     on t1.pl = t2.pl and t1.sta = t2.sta;
大多数(但不是所有)数据库都支持使用

您还可以将其写入
联合所有人
/
分组人

select pl, sta, sum(count_1) as count_1, sum(count_2) as count_2
from ((select pl, sta, count_1, 0 as count_2
       from t1
      ) union all
      (select pl, sta, 0, count_2
       from t2
      )
     ) t2
group by pl, sta;
这在某些情况下很有用:

  • 如果两个表中的每个
    pl
    /
    sta
    都有多行
  • 如果
    pl
    sta
    可能为
    NULL
  • 如果您不喜欢使用
    COALESCE()
    。(那是个笑话)

在标准SQL中,您可以使用
完全联接来编写此代码。为此,我建议使用
using
子句:

select pl, sta,
       coalesce(t1.count_1, 0) as count_1,
       coalesce(t2.count_2, 0) as count_2
from t1 full join
     t2
     on t1.pl = t2.pl and t1.sta = t2.sta;
大多数(但不是所有)数据库都支持使用

您还可以将其写入
联合所有人
/
分组人

select pl, sta, sum(count_1) as count_1, sum(count_2) as count_2
from ((select pl, sta, count_1, 0 as count_2
       from t1
      ) union all
      (select pl, sta, 0, count_2
       from t2
      )
     ) t2
group by pl, sta;
这在某些情况下很有用:

  • 如果两个表中的每个
    pl
    /
    sta
    都有多行
  • 如果
    pl
    sta
    可能为
    NULL
  • 如果您不喜欢使用
    COALESCE()
    。(那是个笑话)

这一功能适用于99%的情况。我有一些地方pl将有一个条目,sta将为空。这使得我有了多行这样的数据。例如:
997 1 0 0 997 0 1 0 997 0 0 1
在这里,我希望所有内容都在一行中,如997 1 1 try now。。。您可以使用另一个合并函数来解释连接条件中的情况,因为我需要99%的情况。我有一些地方pl将有一个条目,sta将为空。这使得我有了多行这样的数据。例如:
997 1 0 0 997 0 1 0 997 0 0 1
在这里,我希望所有内容都在一行中,如997 1 1 try now。。。您可以使用另一个合并来解释连接条件中的情况