SQL-соединение на основе отношения один-ко-многим - PullRequest
0 голосов
/ 12 марта 2010

Хорошо, вот мой оригинальный вопрос;

Таблица 1 содержит

ID|Name  
1  Mary  
2  John  

Таблица 2 содержит

ID|Color  
1  Red  
1  Blue
2  Blue  
2  Green  
2  Black  

Я хочу закончить с

ID|Name|Red|Blue|Green|Black  
1  Mary Y   Y  
2  John     Y     Y     Y

Похоже, что поскольку в таблице 1 имеется 11 уникальных значений цвета и 1000 на 1000 записей, то «хорошего» способа сделать это не существует. Итак, еще два вопроса.

Есть ли эффективный способ запроса, чтобы получить этот результат? Затем я могу создать кросс-таблицу в своем приложении, чтобы получить желаемый результат.

ID|Name|Color  
1  Mary  Red  
1  Mary  Blue  
2  John  Blue  
2  John  Green  
2  John  Black

Если я хотел ограничить количество возвращаемых записей, как я мог сделать запрос, чтобы сделать что-то подобное?

Where ((color='blue') AND (color<>'red' OR color<>'green'))

Так, используя приведенный выше пример, я бы потом вернулся

ID|Name|Color  
1  Mary  Blue  
2  John  Blue  
2  John  Black

Я подключаюсь к таблицам Visual FoxPro через ADODB для использования SQL. Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 марта 2010

Исходя из вашего предыдущего вопроса и запроса к таблице VFP, вы можете получить свои результаты по следующий квалифицированный запрос VFP ... кросс-таблица завершена

select
      N.ID,
      N.Name,
      MAX( IIF( C.Color = "Red", "Y", " " )) Red,
      MAX( IIF( C.Color = "Blue", "Y", " " )) Blue,
      MAX( IIF( C.Color = "Green", "Y", " " )) Green,
      MAX( IIF( C.Color = "Black", "Y", " " )) Black
   FROM
      C_Names N,
      Colors C
   WHERE
      N.ID = C.ID
   GROUP BY 
      N.ID,
      N.Name

Затем, поскольку у вас есть другие "цвета", просто скопируйте МАКС (IIF ()) для этого соответствующего цвета и укажите столбец в качестве имени столбца результата ... следуйте шаблону. Единственная проблема заключается в том, что если у вас разные регистрозависимые варианты написания цветов, вам может понадобиться UPPER (C.Color) = "RED" (или аналогичный для других цветов)

0 голосов
/ 12 марта 2010

Вы хотите сделать кросс-таблицу. Вы можете попробовать использовать мастер перекрестных запросов:
http://msdn.microsoft.com/en-us/library/aa979431%28VS.71%29.aspx

...