使用复合键选择DISTINCT

Spr*_*tty 1 sql sql-server select distinct composite-primary-key

这是我所遇到的问题的简化,但是使用这个例子我想获得给定客户的所有产品记录.给客户可能有很多订单,一些订单可能是同一产品我不想拉回重复的产品.产品表上还有一个复合键.

在一个理想的世界中,这很简单,下面的Query将完成这项工作.但是,由于该表包含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
Run Code Online (Sandbox Code Playgroud)

我想把它重新组织成类似的东西

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
   )
Run Code Online (Sandbox Code Playgroud)

请参阅如何(或可以)在多列上选择DISTINCT?

但是,此方法不适用于SQL Server

有任何想法吗?

理想情况下,我需要一个可移植的解决方案,至少可以在SQLServer,MySQL和Oracle上运行.但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'    
Run Code Online (Sandbox Code Playgroud)

Dav*_*itz 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
Run Code Online (Sandbox Code Playgroud)

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

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


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

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