【发布时间】:2016-07-18 19:40:06
【问题描述】:
我对 SQL Server 数据库中的某些东西很好奇。我当前的查询提取了有关我雇主待售物品的数据。它找到了不到 105,000 个项目的信息,这是正确的。但是,它返回超过 155,000 行,因为每个项目都有其他相关的东西。现在,我通过 Python 中的循环运行该数据,通过检查循环正在处理的项目是否与它刚刚处理的项目相同,手动将其展平。如果是,我开始填写该项目的额外信息。理想情况下,SQL 将返回所有已放入一行的数据。
这里是设置的概述。为简单起见,我省略了一些细节,因为我对一般理论感到好奇,而不是寻找可以复制和粘贴的东西。
商品:包含商品 ID、SKU、描述、供应商 ID、重量和尺寸。
AttributeName:包含 attr_id 和 attr_text。例如,“颜色”、“尺寸”或“样式”。
AttributeValue:包含 attr_value_id 和 attr_text。例如,“蓝色”或“小”。
AttributeAssign:包含 item_id 和 attr_id。这会将属性名称与项目联系起来。
attributeValueAssign:包含 item_id 和 attr_value_id,将属性值绑定到项目。
一系列附件以类似的方式设置,但带有附件和附件分配。附件可以只有值,没有名称,因此不需要像属性那样额外复杂的第三个表。
供应商很简单:在项目表中使用 ID。那就是:
select item_id, vendorName
from item
join vendor on vendor_id = item.vendorNumber
为您获取物品供应商的名称。
现在,有趣的部分是:物品可能有也可能没有供应商、属性或附件。如果他们有后两者中的任何一个,就无法知道他们有多少。我见过属性为 0 的项目和属性为 5 的项目。附件更简单,因为每个项目只能有 0 或 1 个,但 0 的可能性仍然需要外部左连接,所以我保证得到所有项目。
这就是我获得每个项目多行的方式。如果一个项目有三个属性,我会为那个项目得到四行或七行——我不确定它是每个名称/值一行还是每个名称一行和每个值一行。无论哪种方式,这都是我想停止的事情。我希望结果集中的每一行都包含所有属性,上限为 7,任何缺失的属性为 null。也就是说,类似于:
item_id;项目标题; item_sku; ...属性1_name;属性1_值;属性2_名称;属性2_值; ... 属性 7_value
1个;一些随机项目; 123-45; ... 颜色;蓝色;尺寸;中等的; ... 空
现在,我会为此获得多行,例如(仅 ID 和属性):
身份证;属性 1 名称;属性 1 值;属性 2 名称;属性 2 值
1个;颜色;蓝色;空值;空
1个;颜色;蓝色;尺寸;中等
我只关注第二行——所有信息都放在每个唯一项目 ID 的一行中。不过,目前,我得到了多行,而 Python 必须将所有内容放在一起。我将其输出到电子表格,因此有关项目的信息必须在该项目的行上。
如果这太麻烦了,我可以继续使用 Python。但我想知道是否有一种相对容易的方法来做到这一点。我的脚本工作正常,执行时间不是问题。这更多是出于我自己的好奇心,而不是需要让任何东西正常工作。关于如何(或是否)这是可能的任何想法?
【问题讨论】:
-
“一个 MSSQL 数据库,但这不重要”很重要。字符串聚合(这是你想要的)是小菜一碟,例如Postgres,但不在 SQL Server 中。 Edit您的问题并添加一些格式正确的示例数据和预期的输出(请格式化文本)
标签: sql sql-server