我有一张桌子
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
怎么做。
答案 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