使用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
答案 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
详细说明我的评论如下:这是错误数据建模的一个后果的完美示例:查询应该很简单,很难编写和理解。由于您没有实际包含项目实体的表格,因此我们需要在查询中构建此表格(这就是为什么我们将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