Sql选择列基于另一列不等于参数但包含具有相同值

时间:2015-05-03 18:58:05

标签: sql sql-server

很抱歉这个长标题。我现在已经绞尽脑汁待了几个小时,用一张纸试图找出以下最简单的方法。

我有一个订单表,其中包含订单内容,如下所示:

OrderID | ProductSKU | Column 3 etc.

和SKU的表

SKU|Column 2

内容将遵循:

1000  |  SKU
1000  |  SKU1
1001  |  SKU1
1002  |  SKU2
1003  |  SKU

我想要做的是从SKU表中返回SKU数据,如果另一个包含所请求的SKU,并且还有另一行到其订单。因此,在上面的例子中,我不希望1003订单仅返回SKU1,因为它有另一个项目,因此是1000的一部分。这将是“其他人购买的东西”

提前致谢

我的代码是:

SELECT TOP 5 * 
FROM Catalog.Item 
INNER JOIN Orders.OrderLines ON Catalog.Item.SKU = Orders.OrderLines.ProductSKU 
WHERE Orders.OrderLines.ProductSKU = 'MySKU'
GROUP BY Orders.OrderLines.OrderID 
HAVING COUNT(*) > 1

我现在得到的错误是: Column 'Catalog.Item.ProductID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

表1 - Catalog.Item
表2 - Orders.OrderLines

从Orders.OrderLines表获取所有SKU表WHERE订单包含参数SKU。

======新信息======

Catalog.Item表有列SKU,ItemName等(要列出的列的加载) Orders.OrderLines具有OrderID,ProductSKU

我想要返回的是Catalog.Item

中的SKU数据(所有列)

我想搜索一下SKU的Orders.OrderLines表,并返回与相关SKU一起订购的其他订单SKU。

OrderLines示例数据

OrderID   |   ProductSKU
1               Bag1
2               Bag2
2               Bag3
3               Bag2

项目示例数据

SKU       |   ItemName ...
Bag1           Blue Bag
Bag2           Black Bag
Bag3           Pink Bag

我得到的结果是:

SKU         |     ItemName
Bag3              Pink Bag

基于使用SKU Bag2的搜索,因为它本身是一个订单,我不想要但是与另一个项目Bag3的订单

希望现在更有意义。对于之前的困难信息感到抱歉。

1 个答案:

答案 0 :(得分:1)

也许这样的事情?

 Select SkuOrderId, @SkuId
 From tblSku
 Where SkuId = @SkuId
 Group by SkuOrderId
 Having count(*) > 1

您的查询错误非常简单:您不能在select子句中使用任何不在group by子句内或在aggrigate函数内的列。这是sql group by中的一个基本规则,并且有充分理由:数据库会选择在查询中为SKU选择什么?

这就是我在查询中使用@SkuId参数的原因,而不是直接从表中使用SkuId。

在您进一步解释之后,我认为这是您需要的SQL查询:

SELECT DISTINCT CI1.*, OL.*
FROM Catalog.Item CI1
INNER JOIN Orders.OrderLines OL ON CI11.SKU = OL.ProductSKU 
INNER JOIN Catalog.Item CI2 ON(CI1.<YOUR NUMERIC COLUMN NAME> = CI2.<YOUR NUMERIC COLUMN NAME> AND CI1.SKU <> CI2.SKU)
WHERE OL.ProductSKU = @SKUId

由于我们使用Catalog.Item表两次使用不同的SKU值但数字列值相同,因此无需在此解决方案中进行分组。请务必将<YOUR NUMERIC COLUMN NAME>替换为实际的列名。

更新

在您提供的最后一个解释之后,我终于能够创建正确的小提琴并使用sql播放 我想出了一个基于我上次尝试的查询,该查询将根据您的最终描述提供所需的输出。

DECLARE @SKU varchar(10) = 'Bag2'

SELECT CI.*
FROM Orders.OrderLines OL1
INNER JOIN Orders.OrderLines OL2 ON(OL1.OrderId = OL2.OrderId AND OL1.ProductSKU <> OL2.ProductSKU)
INNER JOIN Catalog.Item CI ON(CI.SKU = OL2.ProductSKU)
WHERE OL1.ProductSKU = @SKU

对您提供的示例数据运行此查询会产生以下结果:

SKU      ItemName
Bag3     Pink Bag

Play with it yourself on sqlFiddle.

注意:如果你能更好地写下你的问题,你可以更早得到答案。
每当你对SQL有疑问时,你能做的最好的事情就是提供这3个简单的事情:
1. DDL(创建表格)+ DML(插入数据)来创建样本数据,
2.对你想要达到的目标以及你到达那里的尝试的口头解释 3.所需的输出。