当列具有空值时,不返回任何行 - sql

时间:2014-11-21 10:37:20

标签: sql sql-server tsql sql-server-2012

使用sql-server 2012。有两个表。

tblFeatures

fid  name    subname
-------------------------
10   Size     height
11   Size     Weight
12   Display  Type
13   Display  color

tblItems

cid   price  value    fid
-------------------------
1001  100    xyz      1
1001  100    2cm      10
1001  100    3gm      11
1002  300    abc       1

现在的输出是

 SELECT i.cid,i.price,i.value,f.name,f.subname 
 FROM tblItems i
 LEFT JOIN tblFeatures f on i.fid=f.fid 

cid   price  value  fname fsubname
----------------------------------
1001  100    xyz    NULL     NULL
1001  100    2cm    Size     height
1001  100    3gm    Size     weight
1002  300    abc    NULL     NULL

是否可以这样做:

cid   price  value  fname fsubname
----------------------------------
1001  100    xyz    NULL      NULL
1001  100    2cm    Size     height
1001  100    3gm    Size     weight
1001  100           display  type
1001  100           display  color
1002  300    abc    NULL      NULL    
1002  300           Size     height
1002  300           Size     weight
1002  300           display  type
1002  300           display  color

我尝试了正确的加入,但没有运气

请检查此Fiddle

2 个答案:

答案 0 :(得分:0)

编辑:我完全重写了我的答案,因为我认为我现在理解你的问题了。

尝试这样的事情:

WITH UniqueItems AS (
     SELECT DISTINCT cid, price
     FROM Items
)
SELECT t.cid,t.price,i2.value,t.name,t.subname 
  FROM (select * from UniqueItems i, Features f) t
LEFT JOIN Items i2 ON i2.cid = t.cid AND i2.fid = t.fid

 UNION ALL

SELECT cid, price, value, null, null
  FROM Items
 WHERE fid = 1

ORDER BY cid, name

Fiddle

详细说明我的评论如下:这是错误数据建模的一个后果的完美示例:查询应该很简单,很难编写和理解。由于您没有实际包含项目实体的表格,因此我们需要在查询中构建此表格(这就是为什么我们将CTE与SELECT DISTINCT进行对比)。此外,由于Items-table的fid-column包含在Features表中没有引用任何内容的记录,因此我们需要在union中显式处理它。此外,您在Items表中有冗余数据 - 带有cid 1001的商品的价格是重复的...这将限制您以后遇到麻烦。

更好 - 更简单 - 数据模型可能如下所示:

Items (cid, price, name, weight, height, type, color)

如果你必须有项目"功能"作为记录而不是列,您应该使用至少3个表:

Items (cid, price)
Feature (fid, fname, fsubname)
ItemFeature (cid, fid, value)

答案 1 :(得分:0)

查看完整加入

SELECT i.cid,i.price,i.value,f.name,f.subname 
 FROM tblItems i
 FULL OUTER tblFeatures f on i.fid=f.fid