如何加入这两个表(使用T-SQL)?

时间:2015-07-26 14:05:19

标签: sql-server join

我正在使用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,但这也没有用。

4 个答案:

答案 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中的相应匹配