很抱歉这个长标题。我现在已经绞尽脑汁待了几个小时,用一张纸试图找出以下最简单的方法。
我有一个订单表,其中包含订单内容,如下所示:
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的订单
希望现在更有意义。对于之前的困难信息感到抱歉。
答案 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.所需的输出。