SQL-получение данных из двух таблиц в разных столбцах без использования объединений

У меня есть таблица STOCK которая выглядит так:

 PRODUCT SALES_CODE STOCK_1 STOCK_2 STOCK_3 ----------------------------------------------------- A 6-10 0 1 2 

Есть много STOCK_X но для простоты я исключил.

Теперь у меня есть другая таблица SIZE_GRID :

 SALES_CODE SIZE_1 SIZE_2 SIZE_3 -------------------------------------- 6-10 6 8 10 

Как вы могли догадаться, это запас под рукой для определенного продукта по размеру.

Мне нужно получить значения STOCK из первой таблицы и размер из второй таблицы. Первоначально я делал следующее

 SELECT STOCK.PRODUCT, SIZE_GRID.SIZE_1, STOCK.STOCK_1 FROM STOCK INNER JOIN SIZE_GRID ON SIZE_GRID.SALES_CODE = STOCK.SALES_CODE UNION ALL SELECT STOCK.PRODUCT, SIZE_GRID.SIZE_2, STOCK.STOCK_2 FROM STOCK INNER JOIN SIZE_GRID ON SIZE_GRID.SALES_CODE = STOCK.SALES_CODE UNION ALL SELECT STOCK.PRODUCT, SIZE_GRID.SIZE_3, STOCK.STOCK_3 FROM STOCK INNER JOIN SIZE_GRID ON SIZE_GRID.SALES_CODE = STOCK.SALES_CODE 

У меня около 40 STOCK_X, которые мне нужно получить, поэтому блуждая, если есть намного более простой способ сделать это? Я предпочитаю использовать чистый SQL и не UDF / SP.

http://sqlfiddle.com/#!6/f323e

Если вы используете SQL Server 2008 или более позднюю версию, вы можете попробовать следующий метод ( здесь ):

 SELECT STOCK.PRODUCT, X.SIZE, X.STOCK FROM STOCK INNER JOIN SIZE_GRID ON SIZE_GRID.SALES_CODE = STOCK.SALES_CODE CROSS APPLY ( VALUES (SIZE_GRID.SIZE_1, STOCK.STOCK_1), (SIZE_GRID.SIZE_2, STOCK.STOCK_2), (SIZE_GRID.SIZE_3, STOCK.STOCK_3) ) X (SIZE, STOCK) ; 

С небольшой настройкой вы можете заставить его работать и в SQL Server 2005:

 SELECT STOCK.PRODUCT, X.SIZE, X.STOCK FROM STOCK INNER JOIN SIZE_GRID ON SIZE_GRID.SALES_CODE = STOCK.SALES_CODE CROSS APPLY ( SELECT SIZE_GRID.SIZE_1, STOCK.STOCK_1 UNION ALL SELECT SIZE_GRID.SIZE_2, STOCK.STOCK_2 UNION ALL SELECT SIZE_GRID.SIZE_3, STOCK.STOCK_3 ) X (SIZE, STOCK) ; 

Однако, если вы используете еще более раннюю версию, это может помочь:

 SELECT STOCK.PRODUCT, SIZE = CASE XN WHEN 1 THEN SIZE_GRID.SIZE_1 WHEN 2 THEN SIZE_GRID.SIZE_2 WHEN 3 THEN SIZE_GRID.SIZE_3 END, STOCK = CASE XN WHEN 1 THEN STOCK.STOCK_1 WHEN 2 THEN STOCK.STOCK_2 WHEN 3 THEN STOCK.STOCK_3 END, FROM STOCK INNER JOIN SIZE_GRID ON SIZE_GRID.SALES_CODE = STOCK.SALES_CODE CROSS JOIN ( SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 ) X (N) ; 

Хотя последние два варианта используют UNION ALL, они объединяют только отдельные строки, а не целые подмножества

Рассмотрим нормализацию таблицы. Вместо повторяющегося столбца:

 PRODUCT SALES_CODE STOCK_1 STOCK_2 STOCK_3 

Используйте нормализованную таблицу:

 PRODUCT SALES_CODE STOCK_NO STOCK 

И то же самое для таблицы SIZE_GRID:

 SALES_CODE SIZE_NO SIZE 

Теперь вы можете запросить без необходимости перечислять 40 столбцов:

 select * from STOCK s join SIZE_GRID sg on sg.SALES_CODE = s.SALES_CODE and sg.SIZE_NO = s.STOCK_NO 

Вот несколько альтернатив, которые вы можете использовать:

  • Выполнять каждый SQL отдельно и объединять и сортировать результирующие наборы в вашей программе
  • Присоединитесь к столам.
  • Используйте скалярный подзапрос.

Выбрать
выберите col1, col2, col3 из таблицы_1 q1,

выберите col1, col2, col3 из таблицы_2 q2 из dual;

  • Попробуйте UNION, используя FULL OUTER JOIN с функцией NVL: предполагается, что это имеет более высокую производительность, чем оператор UNION.
 select empno, ename, nvl(dept.deptno,emp.deptno) deptno, dname from emp full outer join dept on (emp.deptno = dept.deptno) order by 1,2,3,4; 
Interesting Posts

Netezza Инкрементальная загрузка с сервера Sql с использованием SSIS

SQL Server – Обеспечение уникальности в одном столбце в зависимости от другого столбца

Выберите запись с самым высоким значением внутри другого выберите

Записи журнала ошибок в SSAS

Наличие в SQL-заявлении не возвращает точных результатов

Установка таймаута запроса на хранимую процедуру в SQL Server 2005

SQL Server – скрипт для обновления столбцов базы данных от varchar до nvarchar, если уже не nvarchar

Почему некоторые системные функции в T-SQL без параметров имеют скобки, а другие нет?

Почему предикатные блокировки не могут быть получены с помощью синтаксиса явного блокирующего запроса

Поведение Strange Sql Server 2005

Добавление значений, если запись равна нулю

Как мы должны захватить пользователя базы данных при использовании структуры сущности на среднем уровне?

Генерировать рядовые серийные номера в SQL Query

Задача скрипта внутри SSIS Для каждого цикла – запись в файл

Проверьте, существует ли столбец перед добавлением таблицы в таблицу SQL без изменения таблицы для каждого столбца

Давайте будем гением компьютера.