2016-11-18 2 views
0

У меня есть две таблицы: CONFIRMATION & CONFIRMATION_PRESSзначения, разделенные запятыми в Select пункта в SQL

КОНФОРМАЦИОННЫЙ Таблица выглядит следующим:

ID_CONF | ID_LOT | QTY 
1005   175  25 
1006   175  24 
1007   175  23 
1008   176  50 

CONFIRMATION_PRESS Таблица выглядит следующим образом:

ID_CONF | ID_PRESS 
1005  11 
1005  22 
1005  33 
1006  12 
1006  13 
1007  14 

Теперь я хочу, чтобы все данные для ID _LOT = 175 из таблицы ПОДТВЕРЖДЕНИЕ, но мне нужно ID_PRESS в значении, разделенном запятыми.

Например, для ID_LOT 175, следующие результаты должны быть отображены:

ID CONF | ID_LOT | QTY | ID_PRESS 
--------+--------+-----+---------- 
1005  175  25 11,22,33 
1006  175  24  12,13 
1007  175  23  14 

Мой запрос выглядит следующим образом:

SELECT 
    C.ID_CONF, 
    C.QTY, 
    C.ID_LOT, 
    STUFF(( 
     SELECT CAST(',' AS VARCHAR(MAX)) + CAST(CP.ID_PRESS AS VARCHAR(5)) 
     FROM CONFIRMATION C, 
      CONFIRMATION_PRESS CP 
     WHERE 
      C.ID_CONF = CP.ID_CONF 
     FOR XML PATH('')), 1, 1, '') PRESS_CSV 
FROM 
    CONFIRMATION C 
WHERE 
    C.ID_LOT = 175 

Но он возвращает этот вывод:

ID CONF | ID_LOT | QTY | ID_PRESS 
--------+--------+-----+------------------ 
1005  175  25 11,22,33,12,13 
1006  175  24 11,22,33,12,13 
1007  175  23 11,22,33,12,13 

Что я здесь делаю неправильно?

Просьба помочь!

С уважением!

+1

[Вредные привычки пинать: использование старого стиля JOIN и] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick- using-old-style-joins.aspx) - стиль старого стиля * разделенный запятыми список таблиц * был заменен синтаксисом * proper * ANSI 'JOIN' в стандарте ANSI - ** 92 ** SQL (** более 20 лет ** назад), и его использование не рекомендуется –

+0

Я написал этот запрос, например. Обычно я использую INNER JOIN/OUTER JOIN в моих запросах. Спасибо за обратную связь! –

ответ

1

Не присоединяйте снова таблицу ПОДТВЕРЖДЕНИЙ в подзапросе. Вы хотите, чтобы строки были связаны с вашим основным запросом.

SELECT 
    C.ID_CONF, 
    C.QTY, 
    C.ID_LOT, 
    STUFF(( 
     SELECT CAST(',' AS VARCHAR(MAX)) + CAST(CP.ID_PRESS AS VARCHAR(5)) 
     FROM CONFIRMATION_PRESS CP 
     WHERE CP.ID_CONF = C.ID_CONF 
     FOR XML PATH('')), 1, 1, '') PRESS_CSV  
FROM CONFIRMATION C 
WHERE C.ID_LOT = 175 
+0

Работал как шарм. Дурак я !! Благодаря тонну :) –

1
Begin Tran 
Create Table CONFIRMATION (ID_CONF Int,ID_LOT Int,QTY numeric) 
INSert into CONFIRMATION 
Select 1005,175,25 Union All 
Select 1006,175,24 Union All 
Select 1007,175,23 Union All 
Select 1008,176,50 

Create Table CONFIRMATION_PRESS (ID_CONF int ,ID_PRESS INt) 
Insert into CONFIRMATION_PRESS 
Select 1005,11 Union All 
Select 1005,22 Union All 
Select 1005,33 Union All 
Select 1006,12 Union All 
Select 1006,13 Union All 
Select 1007,14 

--Select *from CONFIRMATION Inner Join 
--CONFIRMATION_PRESS On CONFIRMATION_PRESS.ID_CONF=CONFIRMATION.ID_CONF 
--Where CONFIRMATION.ID_LOT=175 


SELECT 
    C.ID_CONF, 
    C.QTY, 
    C.ID_LOT, 
    STUFF(( 
      SELECT ', ' + CONVERT(Nvarchar,CP.ID_PRESS) 
      from 
      CONFIRMATION_PRESS CP 

     WHERE 
      C.ID_CONF = CP.ID_CONF 
     FOR XML PATH('')), 1, 2, '') PRESS_CSV 
FROM 
    CONFIRMATION C 
WHERE 
    C.ID_LOT = 175 

RollBack Tran