我有4张桌子:
主表Applications
带有以下示例数据:
Id | Craft_Name | Area | PPE | Potential
---+------------+----------+-----------+-------------
1 | anas | 1, 2, 3, | 4, 1, 3, | 4, 2,
第二张表Area
:
Id | Area
---+----------
1 | Jordan
2 | USA
3 | China
第三张桌子PPE
Id | PPE
---+-----------------
1 | Safety Shoes
2 | Safety Gloves
3 | Electrical Gloves
4 | Thermal Gloves
第四张表Potential
:
ID | Potential
---+----------------------
1 | Working at Height
2 | Falling Objects
3 | Sharp Edges
4 | Inhalation
最后,我需要如下所示的SQL查询结果:
Id | Craft_Name | Area | PPE | Potential
---+------------+---------------------+-------------------------------------------------------+-----------------------------
1 | anas | Jordan, USA, China, | Thermal Gloves, Working at Height, Electrical Gloves, | Inhalation, Falling Objects,
答案 0 :(得分:1)
您可以通过两种方式进行操作。
,或者您可以使用以下代码,它非常复杂,并且其中包含许多复杂的查询。
IF OBJECT_ID('tempdb..#AreaTable') IS NOT NULL
DROP TABLE #AreaTable
IF OBJECT_ID('tempdb..#PPETable') IS NOT NULL
DROP TABLE #PPETable
; WITH AreaTable AS (
SELECT
A.ID, A.CreaftName, AreaName
FROM
(
SELECT T1.ID, T1.CreaftName,T1.[AreaIDs],T2.my_Splits
FROM
(
SELECT *,
CAST('<X>'+replace([AreaIDs],',','</X><X>')+'</X>' as XML) as my_Xml
FROM [dbo].[Applications]) T1
CROSS APPLY
(
SELECT
my_Data.D.value('.','varchar(50)') as my_Splits
FROM
T1.my_Xml.nodes('X') as my_Data(D)
) T2
) A
INNER JOIN [dbo].[Areas] B on A.my_splits = B.ID
)
--SELECT * FROM TempTable
SELECT DISTINCT ST2.ID, St2.CreaftName,
SUBSTRING(
(
SELECT ','+ ST1.AreaName AS [text()]
FROM AreaTable ST1
WHERE ST1.ID = ST2.ID
ORDER BY ST1.ID
FOR XML PATH ('')
), 2, 1000) [Areas]
INTO #AreaTable
FROM [dbo].[Applications] ST2
;WITH PPETable AS (
SELECT
A.ID, A.CreaftName, PPEName
FROM
(
SELECT T1.ID, T1.CreaftName,T1.PPEIDs,T2.my_Splits
FROM
(
SELECT *,
CAST('<X>'+replace(PPEIDs,',','</X><X>')+'</X>' as XML) as my_Xml
FROM [dbo].[Applications]) T1
CROSS APPLY
(
SELECT
my_Data.D.value('.','varchar(50)') as my_Splits
FROM
T1.my_Xml.nodes('X') as my_Data(D)
) T2
) A
INNER JOIN [dbo].[PPE] B on A.my_splits = B.ID
)
--SELECT * FROM TempTable
SELECT DISTINCT ST2.ID, St2.CreaftName,
SUBSTRING(
(
SELECT ','+ ST1.PPEName AS [text()]
FROM PPETable ST1
WHERE ST1.ID = ST2.ID
ORDER BY ST1.ID
FOR XML PATH ('')
), 2, 1000) [PPEs]
INTO #PPETable
FROM [dbo].[Applications] ST2
SELECT MainTable.ID, MainTable.CreaftName, A.Areas, B.[PPEs]
FROM
[dbo].[Applications] AS MainTable
LEFT OUTER JOIN #AreaTable AS A ON MainTable.ID = A.ID
LEFT OUTER JOIN #PPETable AS B ON MainTable.ID = B.ID
IF OBJECT_ID('tempdb..#AreaTable') IS NOT NULL
DROP TABLE #AreaTable
IF OBJECT_ID('tempdb..#PPETable') IS NOT NULL
DROP TABLE #PPETable
您可以使用以下代码生成我创建此脚本时所用的表,以供您参考
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[PPE]') AND type in (N'U'))
DROP TABLE [dbo].[PPE]
GO
/****** Object: Table [dbo].[Areas] Script Date: 23/12/2018 10:43:40 AM ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Areas]') AND type in (N'U'))
DROP TABLE [dbo].[Areas]
GO
/****** Object: Table [dbo].[Applications] Script Date: 23/12/2018 10:43:40 AM ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Applications]') AND type in (N'U'))
DROP TABLE [dbo].[Applications]
GO
/****** Object: Table [dbo].[Applications] Script Date: 23/12/2018 10:43:40 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Applications]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Applications](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CreaftName] [nvarchar](50) NULL,
[AreaIDs] [nvarchar](50) NULL,
[PPEIDs] [nvarchar](50) NULL,
CONSTRAINT [PK_Applications] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
/****** Object: Table [dbo].[Areas] Script Date: 23/12/2018 10:43:40 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Areas]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Areas](
[ID] [int] IDENTITY(1,1) NOT NULL,
[AreaName] [nvarchar](50) NULL,
CONSTRAINT [PK_Ares] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
/****** Object: Table [dbo].[PPE] Script Date: 23/12/2018 10:43:40 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[PPE]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[PPE](
[ID] [int] IDENTITY(1,1) NOT NULL,
[PPEName] [nvarchar](50) NULL,
CONSTRAINT [PK_PPE] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET IDENTITY_INSERT [dbo].[Applications] ON
INSERT [dbo].[Applications] ([ID], [CreaftName], [AreaIDs], [PPEIDs]) VALUES (1, N'Anas', N'1,3,2,', N'1,3')
INSERT [dbo].[Applications] ([ID], [CreaftName], [AreaIDs], [PPEIDs]) VALUES (2, N'Islam', N',6,5,3', N'2')
INSERT [dbo].[Applications] ([ID], [CreaftName], [AreaIDs], [PPEIDs]) VALUES (3, N'Mohammad', N'4', NULL)
SET IDENTITY_INSERT [dbo].[Applications] OFF
SET IDENTITY_INSERT [dbo].[Areas] ON
INSERT [dbo].[Areas] ([ID], [AreaName]) VALUES (1, N'Jordan')
INSERT [dbo].[Areas] ([ID], [AreaName]) VALUES (2, N'China')
INSERT [dbo].[Areas] ([ID], [AreaName]) VALUES (3, N'USA')
INSERT [dbo].[Areas] ([ID], [AreaName]) VALUES (4, N'Colombia')
INSERT [dbo].[Areas] ([ID], [AreaName]) VALUES (5, N'Costa Rica')
INSERT [dbo].[Areas] ([ID], [AreaName]) VALUES (6, N'Panama')
SET IDENTITY_INSERT [dbo].[Areas] OFF
SET IDENTITY_INSERT [dbo].[PPE] ON
INSERT [dbo].[PPE] ([ID], [PPEName]) VALUES (1, N'Safety Shoes')
INSERT [dbo].[PPE] ([ID], [PPEName]) VALUES (2, N'Safety Gloves')
INSERT [dbo].[PPE] ([ID], [PPEName]) VALUES (3, N'Electrical Gloves')
SET IDENTITY_INSERT [dbo].[PPE] OFF
答案 1 :(得分:0)
例如-面积表(继续其他表)
select
(select Area.Area + ','
from dbo.Area
where charindex(',' + cast(Area.Id as varchar(10)) + ',', ',' + isnull(Applications.Area, '') + ',') > 0
for xml path(''))
from
dbo.Applications