2014-02-21 3 views
0

У меня есть таблица фабрики с factoryname: select factoryname from factoryMSSQL - Перебор таблицы и использование значения поля в новом запросе

Я тогда продукты таблица: select productcode from products

Я хочу, чтобы создать список, который имеет продукты для все фабрики.

так Выходной:

mill 1 product 1 
mill 1 product 2 
mill 1 product 3 
mill 2 product 1 
mill 2 product 2 
mill 2 product 3 
mill 3 product 1 
mill 3 product 2 
mill 3 product 3 

У меня есть что-то вроде этого:

DECLARE @numrows int 
DECLARE @i int 
DECLARE @department int 

SET @numrows = (SELECT COUNT(*) FROM factory) 
WHILE (@i <= @numrows) 
    BEGIN 
     SELECT factoryname,product FROM products,factory) 
     SET @i = @i + 1 
    END 

Я, очевидно, от марки, вот, любые советы? Спасибо, как всегда.

+0

Почему бы не присоединиться к двум столам и заказать по фабрике? –

ответ

1

Если вы хотите перечислить все заводские имена и все продукты, вы можете использовать перекрестное соединение, как это:

select factoryname, productname from factory cross join products 

Cross Join в основном декартово произведение 2 таблицы, в результате чего (м * п), если таблица 1 имеет m, а таблица 2 имеет n записей.

+0

так просто, спасибо. – Smudger

+0

Нет проблем! Но помните, что это может быстро стать уродливым для таблиц с огромным количеством строк, даже если один из них большой. –

+0

Это даст вам, для каждой строки в «продуктах», каждую строку на фабриках. Фактически, он вернет «количество строк в продуктах» * «количество строк на фабриках». Не совсем то, что имел в виду объект thestarter, я думаю ... –

2

SQL - это язык, основанный на наборе, поэтому вы должны стараться не использовать циклы в SQL по возможности. Это повредит работе.

То, что вы хотите сделать, это использовать JOIN соединить 2 таблицы вместе:

SELECT factory.factoryname, products.productcode 
FROM factory, products 
INNER JOIN products.factory_id = factory.factory_id 

Что-то вроде этого. Это даст вам набор продуктов, которые производятся на определенной фабрике.

Отображение этого в удобном для пользователя образом должно выполняться в вашем пользовательском интерфейсе в приложении. Не пытайтесь использовать SQL для правильного форматирования данных.

0

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

Надеюсь, что это поможет .... как-то ..........

Смежные вопросы