回答

收藏

SQL Server:左联接所产生的行少于左表中的行

技术问答 技术问答 268 人阅读 | 0 人回复 | 2023-09-14

我正在使用SQL Server(我相信是2005)。6 v4 r& n9 q/ ^0 V+ G& @3 t
我有TableA2列和439行(每行都是唯一的)。5 F  W8 K* N% g8 d8 \
+----------+
6 ~: m/ T& G' Q. E+ b9 [|ID | Name |
& S( Z9 S4 m& D2 Q. O% W! Z  W  S+----------+1 M1 n3 F( Q0 C% W: i
我有TableB35列和数十万行(每行也是唯一的)。
% v$ l3 T4 \! C- G" J- W1 a2 g. A. K+------------------------------------------------------------------------------+' M. {& J1 S& u" P2 t: Q/ @7 e
|Date | ID | Name | Blah1 | Blah2 | ... | Hour1 | Hour2 | Hour3 | ... | Hour24 |# b8 u5 A# N1 P' @  M" h
+------------------------------------------------------------------------------+* S( c# W( P5 [; X3 g9 ?8 `# x8 [
每行TableB都有每小时的观察和其他一些房屋管理信息。现在出于测试目的,我仅对今天的日期(即2013年4月19日)感兴趣。' f3 `* H( t6 r, N0 X' \5 \' A
如果我做:
% p: C8 i0 B) {# W; ~" ASelect count(*) % P, o+ U' H; {0 @; M$ |% [
from TableB
: g7 U7 L6 l6 \where Date = '4/19/2013 12:00:00 AM'3 g0 e. ?3 O% f+ [$ f
我得到10526,这是正确的,因为每天有10526个不同的位置,每小时都有观测数据。
, K! V$ v9 M* X9 x+ W, q9 d我想左连接TableA和TableB on a.id = b.id,它们应该产生具有439行的结果。
4 q' m: [! Z+ a4 h2 T# e$ e/ X2 ]/ p不幸的是,结果有246行。怎么会这样?难道不管是否有匹配项LEFT JOIN都返回所有行吗?TableA``TableB6 {7 |0 m6 n! S! L) ^
编辑 *
/ C+ t! E% T$ W5 o! L$ R% t
! o1 ?0 X6 x) p9 x- [2 h* ?
我使用的完整查询是:
# d* h0 u# [6 r- u& Qselect *
- w- s1 ^$ u* f& Qfrom TableA as a
. g# D" D$ C6 b) |# rleft join TableB as b on a.id = b.id
; G/ O; H3 d2 M1 `: C5 I3 ?+ cwhere RealDate = '4/20/2013 12:00:00 AM'( z+ m+ R5 `/ n" A
                8 D( ^# N: t# Z! _
解决方案:
! H5 [1 P& Y7 y' C" \               
  e  Z% J5 p. L( f; B4 b/ w# U! N3 t
& v8 F3 Z2 r8 u) ^' \" L  Z; s: R) e! A4 Q( E2 G& z
                试试这个:2 k* ?6 W3 y& q1 s& H
select * from TableA as a
1 w9 J' _8 D& a" T5 e* pleft join (SELECT * from TableB where RealDate = '4/20/2013 12:00:00 AM') as b/ X" O+ ^  O  j6 C+ T% W
on a.id = b.id: c" d, Y7 d. A
或这个:% j; M* Z2 r* a! b$ P
select * from TableA as a6 G, D) H7 j! d9 k9 C9 q8 e
left join TableB as b on (a.id = b.id AND RealDate = '4/20/2013 12:00:00 AM')
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则