如何选择正确加入

时间:2017-03-30 09:53:37

标签: sql-server

我有一张桌子

tblItemType(ID int,ItemType varchar(50))

在这里有7个企业。

1   Tyre
2   Nozle
3   Brake
4   Headlight
5   KickPad
6   Battery
7   Seat

我有另一张桌子

Items (ItemType varchar(20), Size int)

在这个表中只有2个itemtype.I想要在items表中选择每个itemtype的第一个条目,如果没有任何项类型的条目应该是0.为此我使用了以下查询: -

select s.ItemType,s.Size from (SELECT SL.Size,SL.ItemType, ROW_NUMBER()
    OVER (PARTITION BY SL.ItemType ORDER BY SL.ItemType) AS RowNum
FROM    Items SL   )s 
right join tblItemType as TS on TS.ItemType=S.ItemType
where s.RowNum = 1 and s.ItemType<>'' group by ts.ItemType,s.ItemType,s.size

但上面的查询正在返回

 ID    ItemType     Size
 1       Tyre        17
 2       Battery     3

OutPut应该是

        ItemType     Size
        Tyre          17
        Battery       3
        Nozle         0
        Brake         0
        Headlight     0
        KickPad       0
        Seat          0

怎么做。

2 个答案:

答案 0 :(得分:1)

试试这个

DECLARE @tblItemType as TAble(ID int,ItemType varchar(50))
Declare @Items AS TABLE(Id int, ItemType varchar(20), Size int)
INSERT INTO @tblItemType VALUES (1,'Tyre'),(2,'Nozle'),(3,'Brake'),(4,'Headlight'),(5,'KickPad'),(6,'Battery'),(7,'Seat')
INSERT INTO @Items VALUES (1, 'Tyre', 17), (2,'Battery', 3)

;WITH temps AS 
(
   SELECT tit.ItemType, ISNULL(i.Size ,0) AS Size, row_number() over(PARTITION BY tit.ItemType ORDER BY i.Id)  AS RowIndex
   FROM @tblItemType tit 
   LEFT JOIN @Items i ON tit.ItemType = i.ItemType
)
SELECT t.ItemType, t.Size FROM temps t WHERE t.RowIndex = 1

答案 1 :(得分:0)

除非我遗漏了某些东西,否则一个简单的左联合与合并可以得到你所需要的东西:

SELECT it.ItemType, COALESCE(Size, 0)
FROM tblItemType it
LEFT JOIN Items i ON it.ItemType = i.ItemType

顺便说一句,如果你已经在tblItemType中有了一个id,你最好用它来创建一个带有item的foriegn键 - 所以如果你可以改变数据库结构,你应该将Items表改为这样:

Items (itemTypeId int (fk to tblItem), size)

然后您的查询将如下所示:

SELECT it.ItemType, COALESCE(Size, 0)
FROM tblItemType it
LEFT JOIN Items i ON it.id = i.ItemTypeId