1 단계는이 테이블 구조를 설계 한 사람을 찾아서 (당신이더라도) 지팡이로 머리를 두들겨 치기위한 것입니다.
2 단계는 테이블을 다시 디자인하기위한 것으로 여기에 필요한 것은 junction table이며 하나의 varchar 열에 여러 개의 정수를 채우지 않아야합니다. 2 단계 끝에서 좋은 측정을 위해 막대기로 원래 디자이너를 다시 공격해야합니다. 당신까지이 돌아 오게해야하는 경우
SELECT *
FROM dbo.tbl_Main_Holding AS rm
LEFT JOIN dbo.tbl_Main_Holding_Requirements AS r
ON r.MainHoldingID = rm.ID
LEFT JOIN [dbo].[tbl_Features] AS f
ON f.ID = r.FeatureID;
: 당신의 참여는 이제 간단 그래서 지금
CREATE TABLE tbl_Main_Holding_Requirements
(
MainHoldingID INT NOT NULL, --FK TO `tbl_main_Holding`
FeatureID INT NOT NULL -- FK TO Require `tbl_Features`
);
각 요구 사항은, 오히려 목록에 새 항목보다,이 테이블의 행을 나타냅니다 쉼표로 구분 된 목록은, 당신은 프리젠 테이션 계층에서 그것을 할, 또는
SQL-Server's XML Extensions와 수 :
SELECT *,
Features = STUFF(f.Features.value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM dbo.tbl_Main_Holding AS rm
OUTER APPLY
( SELECT CONCAT(',', f.Description)
FROM dbo.tbl_Main_Holding_Requirements AS r
INNER JOIN [dbo].[tbl_Features] AS f
ON f.ID = r.FeatureID
WHERE r.MainHoldingID = rm.ID
FOR XML PATH(''), TYPE
) f (Features);
두 번째 단계는 가능하지 않은 경우, 당신은이 LIKE
를 사용하여 주위를 얻을 수 있습니다 : 특징은 하나의 행에 다시 감소해야하는 경우
SELECT *
FROM dbo.tbl_Main_Holding AS rm
LEFT JOIN [dbo].[tbl_Features] AS f
ON ',' + rm.Requirements + ',' LIKE '%,' + CONVERT(VARCHAR(10), f.ID) + ',%';
다시 한 번, 당신은 다시 XML 확장을 사용할 수 있습니다
이
SELECT *,
Features = STUFF(f.Features.value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM dbo.tbl_Main_Holding AS rm
OUTER APPLY
( SELECT CONCAT(',', f.Description)
FROM [dbo].[tbl_Features] AS f
WHERE ',' + rm.Requirements + ',' LIKE '%,' + CONVERT(VARCHAR(10), f.ID) + ',%'
FOR XML PATH(''), TYPE
) f (Features);
또 다른 옵션은 목록으로 쉼표로 구분 된 값을 분할하는 것입니다 어떤 종류의 Split
function을 사용하지만이 기사의 테스트에서 보여 주듯이 목록에서 개별 값에 액세스 할 필요가 없다면 LIKE
을 사용하는 것이 더 효율적입니다.
요구 사항 필드에서 데이터는 실제로 쉼표로 구분 된 값을 가질 수 있습니까? –
예 데이터가 varchar로 저장되고 "1,4,7"처럼 보입니다. 쉼표로 구분됩니다 – RustyHamster
테이블에 대한 DDL 및/또는 두 테이블에 대한 샘플 데이터를 제공하십시오. – scsimon