我無法理解如何在不創建重複記錄的情況下將三個表連接在一起。如何正確加入和分組
我有一個使用表的個人資料我的第一個查詢,多部未華儀器:
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