使用复合键选择DISTINCT

时间:2016-11-14 10:59:13

标签: sql sql-server select distinct composite-primary-key

这是我所遇问题的简化,但使用此示例我想获取给定客户的所有产品记录。 给客户可能有很多订单,而某些订单可能适用于我不想撤回重复产品的同一产品。 产品表上还有一个复合键。

在一个理想的世界中,这很简单,下面的查询将完成这项工作。但是,由于该表包含nText列,因此SQL Server会抱怨" ntext数据类型无法选择为DISTINCT,因为它不具有可比性。"

SELECT distinct p.idA, p.idB, p.descriptionNTEXT
FROM p product, o order, c customer
WHERE o.productID = p.idA AND o.subProductID = p.idB AND o.customerID = c.ID

我想将此重构为

SELECT p1.idA, p1.idB, p1.descriptionNTEXT
FROM   p1 product
WHERE (p1.idA, p1.idB) IN
   (
       SELECT p.idA, p.idB
       FROM p product, o order, c customer
       WHERE o.productID = p.idA AND o.subProductID = p.idB AND o.customerID = c.ID
   )

请参阅How do I (or can I) SELECT DISTINCT on multiple columns?

但是这种方法不适用于SQL Server

任何想法?

理想情况下,我需要一个可移植的解决方案,至少可以在SQLServer,MySQL和Linux上运行。甲骨文。但DB Specific解决方案总比没有好!

以下数据大致显示了我想要的内容。

Customer
ID name
1  Fred

Order
ID  CustomerID productID subProductID
10  1          100       200
11  1          100       200
12  1          100       200
13  1          101       201

Product
IDA  IDB descriptionNTEXT
100  200 'product 1'
101  201 'product 2'    
102  203 'product 3'    

Expected Result
IDA  IDB descriptionNTEXT
100  200 'product 1'
101  201 'product 2'    

4 个答案:

答案 0 :(得分:6)

将NTEXT转换为NVARCHAR(MAX)

SELECT distinct p.idA, p.idB, cast (p.descriptionNTEXT as nvarchar(max))
FROM p product, o order, c customer
WHERE o.productID = p.idA AND o.subProductID = p.idB AND o.customerID = c.ID
  

重要!将删除ntext,text和image数据类型   SQL Server的未来版本。避免在新的中使用这些数据类型   开发工作,并计划修改当前使用的应用程序   他们。请改用nvarchar(max),varchar(max)和varbinary(max)。

https://msdn.microsoft.com/en-us/library/ms187993.aspx

  

nvarchar [(n | max)]可变长度的Unicode字符串数据。 ñ   定义字符串长度,可以是1到4,000之间的值。最大   表示最大存储大小为2 ^ 31-1个字节(2 GB)。该   存储大小(以字节为单位)是输入数据的实际长度的两倍   + 2个字节。 nvarchar的ISO同义词是国家字符变化和国家字符变化。

https://msdn.microsoft.com/en-us/library/ms186939.aspx

答案 1 :(得分:2)

查看你的代码,你似乎想在多个字段中使用IN - 这可以通过EXISTS实现 - 它询问指定的查询是否返回任何行 - 所以基于你的查询它可能是类似

42665

答案 2 :(得分:0)

首先做不同的事情,然后加入产品。

select p.*
    from (
        select distinct CustomerID, productID, subProductID
        from [Order]
    ) do
    join Product p on p.productID = do.IDA and p.subProductID = do.IDB

答案 3 :(得分:0)

您可以尝试此操作而不将其转换为其他类型

SELECT p1.idA, p1.idB, p1.descriptionNTEXT
from product p1 where p1.IDA in( SELECT Distinct p.idA FROM  product p,order o,customer c WHERE o.productID = p.idA AND o.subProductID = p.idB AND o.customerID = c.ID)