Присоединение SQL к отношениям «один ко многим»

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

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

ID|Name  
1  Mary  
2  John  

Вторая таблица содержит

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

Кажется, что из-за того, что существует 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. Спасибо!


person Harley    schedule 12.03.2010    source источник
comment
Какой вопрос? Это неясно.   -  person Justin R.    schedule 12.03.2010


Ответы (2)


Из вашего предыдущего вопроса и запроса к таблице 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

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

person DRapp    schedule 12.03.2010
comment
Спасибо. Это делает это без какого-либо заметного увеличения времени обработки. - person Harley; 13.03.2010

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

person Joel Martinez    schedule 12.03.2010