Как объединить с многозначными столбцами? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть две таблицы:

Game and Developer

Моя игровая таблица имеет следующие столбцы:

Release Date Origin Date DeveloperID 

и моя таблица разработчика имеет следующие столбцы:

DevId Games 

С данными таблицы могут выглядеть примерно так:

Game:
Release Date Origin Date GameId
  11/20/2017  11/09/2015    G-1
  06/07/1999  03/04/1995    G-2
  08/31/2015  02/09/2010    G-3

Таблица разработчика может выглядеть следующим образом:

DevId Games
 D-1   G-1, G-2
 D-2   G-3
 D-3   G1, G2, G3

Игры могут иметь несколько значений, и они выбираются в раскрывающемся списке.

Я хочу создать Соотношение между значениями Игр и GameId таблицы Игр и объединить Дату выпуска и Дату происхождения для каждой из Игр, связанных с Девом.

Так что для D1 я бы хотел что-то вроде

D1 Dates - 11/20/2017, 11/09/2017, 06/07/1999, 03/04/1995 since G-1 and G-2 are associated with D1 
D2 Dates - only 08/31/2015, 02/09/2010
D3 Dates - 11/20/2017, 11/09/2015, 06/07/1999, 03/04/1995, 08/31/2015, 092/09/2010 since all of the Games are associated with this Dev.

То, что у меня есть сейчас, не сокращает это. Это не группирует должным образом и просто перечисляет 6 строк как

11/20/2017
11/09/2015
06/07/1999 
03/04/1995
08/31/2015
02/09/2010

Это моя попытка:

SELECT [Origin Date] & ',' & [Release Date] FROM Game INNER JOIN Developer ON Game.GameId = Developer.Games.Value;

Любая помощь будет оценена

Ответы [ 4 ]

0 голосов
/ 05 сентября 2018

Я предполагаю, что то, что вы должны сделать, переопределит свойства поиска, выполнив следующее:

  • Создайте запрос на основе таблицы Developer, добавьте оба поля в запрос.
  • Переименуйте поле Games в Dates (введите Dates: Games в качестве второго поля)
  • Измените свойства поиска этого поля следующим образом:
    • Дисплей: ComboBox
    • RowsourceType: таблица / запрос
    • RowSource: SELECT Game.DeveloperID, Game.[Release Date] & ", " & Game.[Origin Date] AS Expr1 FROM Game;
    • Связанная колонка: 1
    • Количество столбцов: 2
    • Ширина столбца: 0 (= скрыть первый столбец)
    • Ширина списка: 0 (= Автоматически)

Хотя это на самом деле не объединяет даты, они будут отображаться , как если бы они были (как многозначные поля отображают несколько значений).

Результат немецкой версии (с точкой с запятой в качестве разделителя списка) выглядит следующим образом:

enter image description here

0 голосов
/ 04 сентября 2018

Предполагается, что количество игр ограничено 3. Если это не так, вам, возможно, придется написать еще один подзапрос, чтобы найти максимальное количество игр и построить эквивалентное количество столбцов.

WITH cte AS
(
SELECT DevID, g_1, g_2, g_3
FROM
(
SELECT DevID, ROW_NUMBER() OVER() AS row_num1 FROM DevID
) a
LEFT JOIN
(
SELECT a[1] AS g_1, a[2] AS g_2, a[3] AS g_3, ROW_NUMBER() OVER() AS row_num2
FROM
(
SELECT STRING_TO_ARRAY(games, ',')
FROM DevID
) AS dt(a)
) b
ON a.row_num1 = b.row_num2
) 

SELECT DevId, ARRAY_AGG(release_date) AS release_dates, ARRAY_AGG(origin_date) AS origin_dates
FROM
(
SELECT DevID, game, Release_date, Origin_date
FROM
(
SELECT DevID, LTRIM(game) AS game
FROM
(
SELECT DevId, g_1 AS game FROM cte WHERE g_1 IS NOT NULL
UNION 
SELECT DevId, g_2 AS game FROM cte WHERE g_2 IS NOT NUll
UNION
SELECT DevId, g_3  AS game FROM cte WHERE g_3 IS NOT NULL
) a1
) al
LEFT JOIN
Game g1
ON al.game = g1.GameId
) al1 
GROUP BY DevId

Выход:

DevId   ReleaseDates     OriginDates
"D-2"   "{2015-08-31}"  "{2010-02-09}"
"D-3"   "{2017-11-20,1999-06-07,2015-08-31}"    "{2015-11-09,1995-03-04,2010-02-09}"
"D-1"   "{2017-11-20,1999-06-07}"   "{2015-11-09,1995-03-04}"
0 голосов
/ 04 сентября 2018

Не храните несколько значений в одном столбце! Это не то, как работают базы данных.

Иногда мы застряли с другими людьми, действительно, очень, очень плохими проектами. Вы можете сделать:

SELECT g.[Origin Date] & ',' & g.[Release Date]
FROM Game as g INNER JOIN
     Developer as d
     ON ',' & d.Games & ',' LIKE '*,' & g.GameId & ',*';

Возможно, в MS Access вам нужно сделать это как CROSS JOIN:

  SELECT g.[Origin Date] & ',' & g.[Release Date]
FROM Game as g,
     Developer as d
WHERE ',' & d.Games & ',' LIKE '*,' & g.GameId & ',*';
0 голосов
/ 04 сентября 2018

При работе с «многозначными» полями вам, как правило, приходится прибегать к подобным вещам:

Games = GameId
OR Games LIKE GameId & ',*'
OR Games LIKE '*, ' & GameId & ',*'
OR Games LIKE '*, ' & GameId

Мой синтаксис MSAccess немного ржавый, поэтому он может быть не совсем правильным.


SELECT g.[Origin Date] & ',' & g.[Release Date] 
FROM Game AS g
INNER JOIN Developer AS d
ON d.Games = g.GameId
    OR d.Games LIKE g.GameId & ',*'
    OR d.Games LIKE '*, ' & g.GameId & ',*'
    OR d.Games LIKE '*, ' & g.GameId
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...