我正在使用SQL Server 2014,我将这两个表连接起来,以获得如下所示的输出。
表1(ResStayDate):
ResID StayDate PlanCode Rateamount
150 2015-08-07 UKHB 124.00
150 2015-08-08 UKHB 124.00
150 2015-08-09 UKHB 124.00
176 2015-09-10 FRAI 98.00
176 2015-09-11 FRAI 98.00
188 2015-10-03 GRHB 29.00
188 2015-10-04 GRHB 29.00
188 2015-10-05 GRHB 29.00
表2(ResStay):
ResID CurrencyCode Status
150 GBP OK
176 EUR CANCELED
188 EUR OK
我需要以下输出:
ResID StayDate PlanCode Rateamount CurrencyCode Status
150 2015-08-07 UKHB 124.00 GBP OK
150 2015-08-08 UKHB 124.00 GBP OK
150 2015-08-09 UKHB 124.00 GBP OK
188 2015-10-03 GRHB 29.00 EUR OK
188 2015-10-04 GRHB 29.00 EUR OK
188 2015-10-05 GRHB 29.00 EUR OK
我的查询现在看起来如何(但它没有给出上面的输出):
Use MyDatabase
Select a.ResID
,a.StayDate
,a.PlanCode
,a.Rateamount
,b.CurrencyCode
,b.Status
FROM ResStayDate a
LEFT JOIN ResStay b ON a.ResID = b.ResID
WHERE b.Status <> 'CANCELED'
我无法弄清楚为什么它没有给我我想要的输出。它给了我需要的字段(列),但它多次重复行。这是一个JOIN语法问题吗?我尝试过INNER JOIN,但这也没有用。
答案 0 :(得分:1)
左连接是一个外连接,它生成一个结果,其中包含&#34; left&#34;的所有记录。表,即使参与联接的其他表中没有匹配的记录。
您应该使用INNER JOIN。使用INNER JOIN时结果出了什么问题?
答案 1 :(得分:1)
您表示您已使用内部加入和左加入。内部连接是正确的,它可能只是在你的where子句中拼写错误的单词“Canceled”。以下是创建返回所需输出的数据和查询。
create table ResStayDate
(ResID smallint,
StayDate date,
PlanCode nvarchar(10),
Rateamount decimal (10,2)
)
insert into ResStayDate (ResID,StayDate,PlanCode,Rateamount)
values ('150','2015-08-07','UKHB','124'),
('150','2015-08-08','UKHB','124'),
('150','2015-08-09','UKHB','124'),
('176','2015-09-10','FRAI','98'),
('176','2015-09-11','FRAI','98'),
('188','2015-10-03','GRHB','29'),
('188','2015-10-04','GRHB','29'),
('188','2015-10-05','GRHB','29')
create table ResStay
(ResID smallint,
CurrencyCode nvarchar(10),
StatusCode nvarchar(10)
)
insert into ResStay (ResID,CurrencyCode,StatusCode)
values ('150','GBP','OK'),
('176','EUR','CANCELLED'),
('188','EUR','OK')
Select *
from ResStayDate as rd
inner join ResStay as rs
on rd.ResID=rs.ResID
where rs.StatusCode<>'CANCELLED'
ResID StayDate PlanCode Rateamount CurrencyCode Status
150 2015-08-07 UKHB 124.00 GBP OK
150 2015-08-08 UKHB 124.00 GBP OK
150 2015-08-09 UKHB 124.00 GBP OK
188 2015-10-03 GRHB 29.00 EUR OK
188 2015-10-04 GRHB 29.00 EUR OK
188 2015-10-05 GRHB 29.00 EUR OK
答案 2 :(得分:0)
您要么拥有比您想象的更多的行,请使用以下方法进行测试:
Select *
FROM ResStayDate a
WHERE a.ResID = 150
Select *
FROM ResStay b
WHERE b.ResID = 150
或者你有一个错字:
LEFT JOIN ResStay b ON a.ResID = a.ResID
答案 3 :(得分:0)
ResStayDate中有重复的ID,因此它基于id匹配每一行。因为你正在使用左连接(这意味着给我左边的表中的每一行以及右边的任何匹配的列),你将在ResStayDate中的每一行都有行,并且它将为没有的列添加空值ResStay中的相应匹配