Sql server 在不同的列上选择DISTINCT而不是JOIN

Sql server 在不同的列上选择DISTINCT而不是JOIN,sql-server,join,distinct,Sql Server,Join,Distinct,我已经花了8个多小时在这个问题上胡闹,在网上搜索,但仍然无法让它做我需要的事情。所以我希望这里有人能帮忙 我基本上是尝试连接两个由产品ID链接的表,但是,我只想给出不同图像ID的结果,而不是它连接的结果 tbl_图像是一个包含唯一数字的表格。ProductDetails表是一种将这些图像ID链接到细节的方法。多个产品详细信息可以具有相同的图像ID 以下是我当前的查询: SELECT DISTINCT i.img_id, p.img_id AS detail_img_id FROM dbo.P

我已经花了8个多小时在这个问题上胡闹,在网上搜索,但仍然无法让它做我需要的事情。所以我希望这里有人能帮忙

我基本上是尝试连接两个由产品ID链接的表,但是,我只想给出不同图像ID的结果,而不是它连接的结果

tbl_图像是一个包含唯一数字的表格。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)
如果我只在select中返回img_id,它可以正常工作,但我还需要它返回详细的img_id,这就是它开始不适用于我的地方,只返回我需要的不同行

我现在得到的是:

+--------+---------------+
| 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 |
+--------+---------------+

谢谢你能提供的任何帮助

MS SQL Server不像PostgreSQL那样具有独特的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

我不确定我是否正确理解了您的问题,但如果我这样做,听起来您需要使用左联接:如果我误解了,您所需结果集中的0会让我感到有点抱歉:

准备工作:

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

听起来您需要所有图像,以及与产品细节匹配的图像。如果产品详细信息中没有记录,则为产品图像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)

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

您能用简单的术语描述您想要的结果吗?我无法理解img_id和detail_img_id之间的关系。例如,我希望detail_img_id与img_id匹配,或者如果不匹配,则为0。我有一个表映像id,并且它们中的每一个都是唯一的。然后我可以将这些图像分配给任何产品细节。因此,可以有许多具有相同图像ID的产品详细信息。因此,基本上,我希望它只提供图像表中的不同图像ID,如果它从未链接到产品详细信息,则将其设置为0,否则它可以表示为1或其他一些。。。这只是一种让我知道它基本上是否链接到某个细节的方法。那么为什么不在产品细节图像id为空的情况下启动图像表左键连接到产品细节呢?你说你想要任何未使用的图像,对吗?我想要已使用和未使用的图像,但我需要通过输出知道它们是否已被分配。所以我知道我的图像1918从未在任何产品上使用过,应该输出0,但它不是这样工作的。数据库中没有空值,默认为0或一个数字。是的,但当您使用从图像到产品详细信息的外部联接时,将显示空值,因为该图像在产品详细信息中不存在。OP要求两列分开。这对我不起作用,因为它没有在我提供的id号上联接。它在不同的ProductID列上联接。所以您想要两个单独的列表吗?一个用于ID,一个用于DID,或者您希望在一个查询答案中同时使用它们?如果单个ID值比实际值多怎么办?我希望结果可以在一个查询中返回。是的,存在多次具有相同ID值的DID值。我希望,如果ID的所有DID值都是0,那么它将返回0,如果任何DID值都不是0,那么它将显示其他值,这并不重要。谢谢谢谢谢谢,这非常接近,因为我为img_id列返回了正确数量的行,但是它将所有的detail_img_id设置为0。@Twenty Three应该按降序排列行数,抱歉。请看我编辑的答案。它现在正做相反的事情,使所有的细节ID值为1917。我想我不明白这是怎么回事。我有一个包含唯一ID的图像表,然后还有一个可以分配这些ID的详细信息表。比如说,我的1918年的照片从来没有被赋予任何细节。理论上,它应该在输出屏幕上显示为0,而不是1917,因为它从来没有被赋值。谢谢。你上面的评论让我用空值找到了正确的方向,我也想到了一些东西。你的也让我得到了同样的结果。比 又来了!!被问及有关distinct的定义,这是一个合并/加入问题!:P一切都好;很高兴我们能帮忙。不是批评,只是一种观察,以防其他人遇到这种情况。