как получить столбцы из объединенной таблицы подряд вместо соседних столбцов - PullRequest
0 голосов
/ 17 июня 2019

У меня есть две таблицы PRODUCT и PRODUCTMODEL. Они могут быть объединены с использованием PRODUCTMODELID. Я хочу получить вывод, чтобы строки из таблицы PRODUCTMODEL находились ниже строк таблицы PRODUCT FOR EACH PRODUCT.

Выходные данные должны быть в плоском файле. Я могу позаботиться о плоских файлах. Я хочу, чтобы какое-то направление получало объединенные данные в строках, а не в столбцах.

CREATE TABLE [PRODUCT](
    [PRODUCTID] [INT] NOT NULL,
    [PRODUCTMODELID] [INT],
    [NAME] [DBO].[NAME] NOT NULL,
    [PRODUCTNUMBER] [NVARCHAR](25) NOT NULL,
)

CREATE TABLE [PRODUCTMODEL](
    [PRODUCTMODELID] [INT] NOT NULL,
    [NAME] [NVARCHAR](25) NOT NULL
)

INSERT INTO PRODUCTMODEL (PRODUCTMODELID, NAME)
VALUES (11, 'LONG-SLEEVE LOGO JERSEY')

INSERT INTO PRODUCT (PRODUCTID, PRODUCTMODELID, NAME, PRODUCTNUMBER)
VALUES (713, 11, 'LONG-SLEEVE LOGO JERSEY', 'LJ-0192-S')

INSERT INTO PRODUCT (PRODUCTID, PRODUCTMODELID, NAME, PRODUCTNUMBER)
VALUES (714, 11, 'LONG-SLEEVE LOGO JERSEY', 'LJ-0192-M')

INSERT INTO PRODUCT (PRODUCTID, PRODUCTMODELID, NAME, PRODUCTNUMBER)
VALUES (715, 11, 'LONG-SLEEVE LOGO JERSEY', 'LJ-0192-L')

INSERT INTO PRODUCT (PRODUCTID, PRODUCTMODELID, NAME, PRODUCTNUMBER)
VALUES (716, 11, 'LONG-SLEEVE LOGO JERSEY', 'LJ-0192-X')

Ожидаемый результат:

|PRODUCT|713|LONG-SLEEVE LOGO JERSEY|LJ-0192-S|
|MODEL|11|Long-Sleeve Logo Jersey|
|PRODUCT|714|LONG-SLEEVE LOGO JERSEY|LJ-0192-M|
|MODEL|11|Long-Sleeve Logo Jersey|
|PRODUCT|715|LONG-SLEEVE LOGO JERSEY|LJ-0192-L|
|MODEL|11|Long-Sleeve Logo Jersey|
|PRODUCT|716|LONG-SLEEVE LOGO JERSEY|LJ-0192-X|
|MODEL|11|Long-Sleeve Logo Jersey|

Ответы [ 3 ]

1 голос
/ 17 июня 2019
;
WITH temp
AS (SELECT
  'Product' AS Type,
  CAST([PRODUCTID] AS varchar(10)) AS PID,
  [PRODUCTMODELID],
  [PRODUCTNUMBER],
  CAST(productModelid AS varchar(10)) + '_1' AS DOrder
FROM Product

UNION

SELECT
  'Model' AS Type,
  '' AS PID,
  [PRODUCTMODELID],
  '' AS ProductNumber,
  Name,
  CAST(productModelid AS varchar(10)) + '_2' AS DOrder
FROM PRODUCTMODEL)

SELECT
  *
FROM temp
ORDER BY dOrder
1 голос
/ 17 июня 2019

Вы можете попробовать использовать JOIN в подзапросе или CTE, а затем использовать CROSS APPLY значение, чтобы сделать UNION ALL

;WITH CTE AS (
    SELECT p.PRODUCTMODELID PRODUCTMODELID,
           p.NAME pName,
           pm.Name pmName,
           PRODUCTID,
           PRODUCTNUMBER
    FROM PRODUCT p JOIN PRODUCTMODEL pm 
    ON pm.PRODUCTMODELID =p.PRODUCTMODELID
)
SELECT v.*
FROM CTE CROSS APPLY (
    VALUES 
    ('PRODUCT',pmName,PRODUCTID,PRODUCTNUMBER),
    ('MODEL',pName,PRODUCTMODELID,'')
) v (col1,col2,col3,col4)

sqlfiddle

1 голос
/ 17 июня 2019

Попробуйте использовать перекрестное применение

;WITH CTE AS 
(
SELECT CONCAT('|PRODUCT|',P.PRODUCTID,'|',P.NAME,'|',P.PRODUCTNUMBER,'|') AS Col1,
        CONCAT('|MODEL|',PM.PRODUCTMODELID,'|',PM.NAME+'|') AS COl2       
 FROM [PRODUCT] P
 INNER JOIN [PRODUCTMODEL] PM
    ON PM.PRODUCTMODELID = P.PRODUCTMODELID
 )
 SELECT Result 
 FROM CTE
 CROSS APPLY (VALUES (Col1,'Col1'),(Col2,'Col2')
              )DT (Result,Names)

Результат

|PRODUCT|713|LJ-0192-S|
|MODEL|11|LONG-SLEEVE LOGO JERSEY|
|PRODUCT|714|LJ-0192-M|
|MODEL|11|LONG-SLEEVE LOGO JERSEY|
|PRODUCT|715|LJ-0192-L|
|MODEL|11|LONG-SLEEVE LOGO JERSEY|
|PRODUCT|716|LJ-0192-X|
|MODEL|11|LONG-SLEEVE LOGO JERSEY|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...