选择与JOIN

时间:2017-05-18 17:47:36

标签: sql-server join distinct

我一直在搞乱这个查询超过8个小时并在网上搜索,仍然无法让它做我需要它。所以我希望有人可以提供帮助

我基本上尝试连接两个通过产品ID链接的表,但是,我只想提供DISTINCT图像ID的结果(这不是它所加入的)。

tbl_images是一个包含唯一数字的表。 ProductDetails表是一种可以将这些图像ID链接到细节的方法。多个产品详细信息可以具有相同的图像ID。

这是我当前的查询:

SELECT DISTINCT i.img_id, p.img_id AS detail_img_id  
FROM dbo.ProductDetails AS p  
INNER JOIN dbo.tbl_images AS i  
  ON p.ProductID = i.product_id  
WHERE (i.product_id = 22598)

如果我只在我的选择中返回img_id它可以正常工作,但我还需要它来返回detail_img_id这就是它开始对我不起作用并返回不同的行I需要。

我目前得到的是:

+--------+---------------+
| img_id | detail_img_id |
+--------+---------------+
|   1916 |             0 |
|   1916 |          1916 |
|   1916 |          1917 |
|   1917 |             0 |
|   1917 |          1916 |
|   1917 |          1917 |
|   1918 |             0 |
|   1918 |          1916 |
|   1918 |          1917 |
+--------+---------------+

我希望它能在下面返回。如果图像从未被分配给任何细节,它应该拉回0,如果没有,它可以显示其他数字。

+--------+---------------+
| img_id | detail_img_id |
+--------+---------------+
|   1916 |          1916 |
|   1917 |          1917 |
|   1918 |             0 |
+--------+---------------+

感谢您提供任何帮助!

3 个答案:

答案 0 :(得分:0)

不幸的是,MS SQL Server没有像PostgreSQL那样的distinct on语法(至少不是我所知道的),但您可以使用row_number窗口函数模拟此行为:

SELECT img_id, detail_img_id
FROM   (SELECT i.img_id AS img_id, 
               p.img_id AS detail_img_id
               ROW_NUMBER() OVER (PARTITION BY i.img_id
                                  ORDER BY p.img_id DESC) AS rn
        FROM   dbo.ProductDetails AS p
        JOIN   dbo.tbl_images AS i ON p.ProductID = i.product_id
        WHERE  i.product_id = 22598) t
WHERE   rn = 1

答案 1 :(得分:0)

我不确定我是否正确理解你的问题,但如果我这样做听起来你需要使用左连接:你想要的结果集中的0会让我有点抱歉如果我误解了:)) p>

准备工作:

DECLARE @IM TABLE (id INTEGER)
DECLARE @DIM TABLE (did INTEGER)
INSERT INTO @IM
      select  1916
union all select  1916
union all select  1916
union all select  1917
union all select  1917
union all select  1917
union all select  1918
union all select  1918
union all select  1918     


INSERT INTO @DIM
        ( did )

  select    0
union all select 1916
union all select 1917
union all select    0
union all select 1916
union all select 1917
union all select    0
union all select 1916
union all select 1917

产量

id
-----------
1916
1916
1916
1917
1917
1917
1918
1918
1918

(9 row(s) affected)

did
-----------
0
1916
1917
0
1916
1917
0
1916
1917

(9 row(s) affected)

使用:

SELECT i.id
    ,d.did
FROM @IM I
LEFT JOIN @dim D ON i.id = d.did
GROUP BY i.id
    ,d.did

收率:

id          did
----------- -----------
1916        1916
1917        1917
1918        NULL

(3 row(s) affected)

关于你的澄清:

DECLARE @IM TABLE (id INTEGER, did INTEGER)
INSERT INTO @IM (id, did)
      select      1916,  0
union all select  1916, 1916 
union all select  1916, 1917
union all select  1917,    0
union all select  1917, 1916
union all select  1917, 1917
union all select  1918,    0
union all select  1918, 1916
union all select  1918, 1917  

SELECT id, x.maxdid AS MaxDiD
FROM @im i
OUTER APPLY (SELECT MAX(did) AS maxdid FROM @im i2 WHERE i2.id = i.id) x
GROUP BY id, maxdid

答案 2 :(得分:0)

听起来像是想要所有图像,以及那些与产品详细信息相匹配的图像。如果产品详细信息中没有记录为产品图像ID返回0。

所以...我们将图像外部连接到细节并将p.image_ID合并为0,因此将空值转换为0.

看起来您缺少连接标准以使其正常工作。和一个合并。

SELECT i.img_id, coalesce(p.img_id,0) AS detail_img_id  
FROM dbo.ProductDetails AS p  
RIGHT JOIN dbo.tbl_images AS i  
  on p.productID = i.product_ID
 and p.img_Id = i.img_Id
WHERE (i.product_id = 22598)

或者如果你对左连接感觉更舒服......

SELECT i.img_id, coalesce(p.img_id,0) AS detail_img_id  
FROM JOIN dbo.tbl_images AS i  
LEFT JOIN dbo.ProductDetails AS p  
  on p.productID = i.product_ID
 and p.img_Id = i.img_Id
WHERE (i.product_id = 22598)

您在结果中看到的重复是因为您刚加入product_ID;我认为您需要包含图像,因为两个表都包含productID,两个表都包含图像。