我无法理解如何在不创建重复记录的情况下将三个表连接在一起。如何正确加入和分组
我有一个使用表的个人资料我的第一个查询,多部未华仪器:
SELECT
[p].[shopper_id]
, [pi].[instrument_id]
FROM
[dbo].[profile] [p]
INNER JOIN [dbo].[profile_instruments] [pi]
ON [pi].[PID] = [p].[PID]
WHERE
[p].[date_created] > DATEADD(yy, -2, GETDATE())
AND [p].[shopper_id] = '53D5444535434747A935E207C9EDD96A'
ORDER BY
[p].[shopper_id];
该查询给我的结果:
shopper_id instrument_id
53D5444535434747A935E207C9EDD96A 35
53D5444535434747A935E207C9EDD96A 17
我的第二个查询使用表的个人资料和表格样式:
SELECT
[p].[shopper_id]
, [ps].[style_id]
FROM
[dbo].[profile] [p]
INNER JOIN [dbo].[profile_styles] [ps]
ON [ps].[PID] = [p].[PID]
WHERE
[p].[date_created] > DATEADD(yy, -2, GETDATE())
AND [p].[shopper_id] = '53D5444535434747A935E207C9EDD96A'
ORDER BY
[p].[shopper_id];
结果是:
shopper_id style_id
53D5444535434747A935E207C9EDD96A 845
53D5444535434747A935E207C9EDD96A 291
当我结合了3代表的个人资料,仪器仪表和风格:
SELECT
[p].[shopper_id]
, [pi].[instrument_id]
, [ps].[style_id]
FROM
[dbo].[profile] [p]
INNER JOIN [dbo].[profile_instruments] [pi]
ON [pi].[PID] = [p].[PID]
INNER JOIN [dbo].[profile_styles] [ps]
ON [ps].[PID] = [p].[PID]
WHERE
[p].[date_created] > DATEADD(yy, -2, GETDATE())
AND [p].[shopper_id] = '53D5444535434747A935E207C9EDD96A'
ORDER BY
[p].[shopper_id];
我得到的结果:
shopper_id instrument_id style_id
53D5444535434747A935E207C9EDD96A 35 845
53D5444535434747A935E207C9EDD96A 35 291
53D5444535434747A935E207C9EDD96A 17 845
53D5444535434747A935E207C9EDD96A 17 291
我没有使用一组通过但因为我不能确定如何将其应用于我拥有的专栏。我也不确定重复项是因为我使用的连接类型,还是因为我没有使用群组。
无论如何,我想寻求一些帮助,以便能够找出我需要什么修改我的查询,以使有一个输出,看起来像:
shopper_id instrument_id style_id
53D5444535434747A935E207C9EDD96A 35 845
53D5444535434747A935E207C9EDD96A 17 291
谢谢提前寻求你的帮助。
我们如何知道instrument_ID 35与style_ID 845而不是291?简单地说,你错过了一个定义这种关系的关联。没有它你会看到你看到的4个结果。所以在最后的加入你需要一个和PS。 = PI。表示哪种乐器与哪种风格的关系。如果无关紧要,您可以为每条记录分配一个行号并加入行号,但是这假设两个表的每个购物者的记录数相等。 – xQbert
他们彼此独立。配置文件和乐器以及配置文件和样式之间有关系,但不在乐器和样式之间。 –
那么我们怎么知道35会转到845而不是291?在这个例子中我再次看不到2条记录的预期结果。如果它真的没有关系,那么行数概念可能会起作用;但它假定每个表中的记录数相等,或者当每个购物者的记录数不相等时,您需要使用外部联接。 – xQbert