Mysql 根据其中一个表的值从两个表中进行选择

Mysql 根据其中一个表的值从两个表中进行选择,mysql,sql,Mysql,Sql,1) 表1表示结构如下的表1: moduleID | moduleName 10 | XYZ 20 | PQR 30 | ABC 2) 表2表示结构如下的表2: moduleID |级别|值 10 | 1 | 20 10 | 2 | 30 30 | 3 | 40 10 | 3 | 50 20 | 2 | 30 moduleID是表1中的主键,列level的值可以是1到3。 现在需要按如下方式显示数据: m

1) 表1表示结构如下的表1:

moduleID | moduleName
10 | XYZ
20 | PQR
30 | ABC

2) 表2表示结构如下的表2:

moduleID |级别|值
10    |   1    |  20
10    |   2    |  30
30    |   3    |  40
10    |   3    |  50
20    |   2    |  30
moduleID
是表1中的主键,列
level
的值可以是1到3。
现在需要按如下方式显示数据:

moduleID | moduleName | Level1 | Level2 | Level3
10 | XYZ | 20 | 30 | 50
20 | PQR |空| 30 |空
30 | ABC |空|空| 50

更简单地说,表2中列
Level
的值显示为Level1、Level2和Level3,每个级别对应的值填充在相应的
moduleID
行中。
有什么帮助吗?这里是SQL的初学者。与视图有关吗?

对表2中的每个级别执行
左连接

select t1.*, t2_l1.value as Level1, t2_l2.value as Level2, t2_l3.value as Level3
from table1 t1
left join table2 t2_l1 on t1.moduleID = t2_l1.moduleID and t2_l1.Level = 'Level1'
left join table2 t2_l2 on t1.moduleID = t2_l2.moduleID and t2_l2.Level = 'Level2'
left join table2 t2_l3 on t1.moduleID = t2_l3.moduleID and t2_l3.Level = 'Level3'
如果moduleID对于一个级别具有多个不同的值,则将返回所有这些值。(如果您想要求和,请查看Giorgos Betsos的答案。)

您可以使用条件聚合:


参考所有流程,它将很好地满足您的期望答案

CREATE TABLE Table1
(moduleName VARCHAR(50),moduleID INT)
GO
--Populate Sample records
INSERT INTO Table1 VALUES('.NET',10)
INSERT INTO Table1 VALUES('Java',20)
INSERT INTO Table1 VALUES('SQL',30)

CREATE TABLE Table2
(moduleID INT,[Level] INT,Value INT)
GO
--Populate Sample records
INSERT INTO Table2 VALUES(10,1,20)
INSERT INTO Table2 VALUES(10,2,30)
INSERT INTO Table2 VALUES(30,3,40)
INSERT INTO Table2 VALUES(10,3,50)
INSERT INTO Table2 VALUES(20,2,30)
INSERT INTO Table2 VALUES(20,4,60)
GO

CREATE VIEW [dbo].[vw_tabledata]
AS
SELECT t1.[moduleID],[moduleName]
      ,[Level]
      ,[Value]
  FROM [db_Sample].[dbo].[Table2] t2 inner join [db_Sample].[dbo].[Table1] t1 on t1.[moduleID] = t2.[moduleID]
GO







DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME([Level])
FROM (SELECT DISTINCT [Level] FROM Table2) AS [Level]

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT moduleID,moduleName, ' + @ColumnName + '
    FROM [vw_tabledata] 
    PIVOT(MAX(Value) 
          FOR [Level] IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

如问题中所述,如果表2中列级别的值不是固定的,该怎么办。。可以取1到10个值(实际上是场景)…有更好的方法吗?你的意思是你可以有任意数量的不同级别,例如级别17和级别79?没有…最多10个。添加左连接不是一个好的做法。我理解。如果一个moduleid在一个级别上有多个值,那么预期的结果是什么?如果表2中列级别的值不是固定的,…如问题中所述。。可以使用1到10个值(实际上是场景)…有没有更好的方法..更通用的方法?@lazyrabit您可以使用任意多的条件。如果级别的数量是动态的,那么你必须使用动态sql和准备好的语句。举个例子会非常有帮助:)这是一个交叉表或枢轴,但更简单的是在应用程序代码(例如PHP循环)中解决(容易扩展),正如我在前面的回答中所评论的,如果级别列的值最多可以达到10,那么任何通用方法都可以??感谢您提供此答案,已修改。
CREATE TABLE Table1
(moduleName VARCHAR(50),moduleID INT)
GO
--Populate Sample records
INSERT INTO Table1 VALUES('.NET',10)
INSERT INTO Table1 VALUES('Java',20)
INSERT INTO Table1 VALUES('SQL',30)

CREATE TABLE Table2
(moduleID INT,[Level] INT,Value INT)
GO
--Populate Sample records
INSERT INTO Table2 VALUES(10,1,20)
INSERT INTO Table2 VALUES(10,2,30)
INSERT INTO Table2 VALUES(30,3,40)
INSERT INTO Table2 VALUES(10,3,50)
INSERT INTO Table2 VALUES(20,2,30)
INSERT INTO Table2 VALUES(20,4,60)
GO

CREATE VIEW [dbo].[vw_tabledata]
AS
SELECT t1.[moduleID],[moduleName]
      ,[Level]
      ,[Value]
  FROM [db_Sample].[dbo].[Table2] t2 inner join [db_Sample].[dbo].[Table1] t1 on t1.[moduleID] = t2.[moduleID]
GO







DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME([Level])
FROM (SELECT DISTINCT [Level] FROM Table2) AS [Level]

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT moduleID,moduleName, ' + @ColumnName + '
    FROM [vw_tabledata] 
    PIVOT(MAX(Value) 
          FOR [Level] IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery