2013-07-05 52 views
0

2I返回值有以下两个表中的相关字段:SQL查询:即使它们不匹配

Values: id, data, quantity 
Items: id, data, price 

比赛取决于以下字段:ID,数据。我试图加入这两个表,所以如果对于相同的ID和数据有一个元素的值,但不是在项目中,价格设置为0;而如果在项目的元素,但不是在值的字段数量设置为0

到目前为止,我已经写了下面的代码,但它不会返回我什么!

SELECT  dbo.Values.id, dbo.Values.data, dbo.Values.quantity, dbo.Items.price 
FROM  dbo.Values FULL OUTER JOIN 
      dbo.Items ON dbo.Values.id = dbo.Items.id AND dbo.Values.data = dbo.Items.data 

实施例:

Values       Items       Join 
(1, 05/07/2013 00:00:00, 2)  (1, 05/07/2013 00:00:00, 20)  (1, 05/07/2013 00:00:00, 2, 20) 
(2, 23/06/2013 00:00:00, 50) (2, 03/02/2013 00:00:00, 1000) (2, 23/06/2013 00:00:00, 50, 0) 
                   (2, 03/02/2013 00:00:00, 0, 1000) 
+0

请告诉我哪个是您在这两个表中的主键还是您使用复合键? –

+0

对于主键是id,而Items是视图 – Camilla

回答

0

FULL OUTER JOIN返回两个表中所有的值,即使条件不匹配。因此,您的查询将返回两个表的所有行。

1

你的加入效果很好,但你没有利用coalesce或isnull ... fidle它。

SELECT  ISNULL(dbo.[Values].id, dbo.Items.id), ISNULL(dbo.[Values].DATA, dbo.Items.DATA), ISNULL(dbo.[Values].quantity, 0), ISNULL(dbo.Items.price, 0) 
FROM  dbo.[Values] 
FULL OUTER JOIN dbo.Items ON dbo.[Values].id = dbo.Items.id AND dbo.[Values].data = dbo.Items.DATA 
+0

您的查询比我的查询更好,但是如果Items中的值与Values中的元素不匹配,则不会返回任何内容。看看我上面写的例子,它不会将字段返回给我:(1,03/02/2013 00:00:00,0,1000) – Camilla

+0

在您编写的任何样本行中没有这样的行,最接近的是2,03/02/2013 00:00:00,1000,它确实出现。看看小提琴http://sqlfiddle.com/#!3/97d8d/2/0 –

+0

它在小提琴中工作,但是当我在我的sql执行查询它不会返回我这一行(2,03/02/2013 00:00:00,0,1000) – Camilla