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)
但是,此方法不适用于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)
将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