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