Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何基于表名在SQL中进行连接?_Sql_Syntax_Join - Fatal编程技术网

如何基于表名在SQL中进行连接?

如何基于表名在SQL中进行连接?,sql,syntax,join,Sql,Syntax,Join,好的,我们有一组表,它们的名称如下: training_data_001 training_data_002 training_data_003 training_data_004 training_data_005 SELECT foo FROM master WHERE id = ? INNER JOIN training_data_${master.training_type} ON foo.id = training_data_${master.training_type}.foo_

好的,我们有一组表,它们的名称如下:

training_data_001
training_data_002
training_data_003
training_data_004
training_data_005
SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_${master.training_type}
ON foo.id = training_data_${master.training_type}.foo_id
create view training_data_all as
select '001' as training_type, * from training_data_001
union all
select '002' as training_type, * from training_data_002
union all
select '003' as training_type, * from training_data_003
union all
select '004' as training_type, * from training_data_004
union all
select '005' as training_type, * from training_data_005
然后,为了找到我们在另一个表中查看的字段,我们将其称为master.training\u类型

无论如何,我想知道是否有人知道用这种数据进行奇怪的基于表名的连接的方法。大概是这样的:

training_data_001
training_data_002
training_data_003
training_data_004
training_data_005
SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_${master.training_type}
ON foo.id = training_data_${master.training_type}.foo_id
create view training_data_all as
select '001' as training_type, * from training_data_001
union all
select '002' as training_type, * from training_data_002
union all
select '003' as training_type, * from training_data_003
union all
select '004' as training_type, * from training_data_004
union all
select '005' as training_type, * from training_data_005
我知道我可以在客户端做这件事,但是如果让db来做就好了

还要注意:它是SQL Server

更新:我决定只在客户端进行更新。谢谢大家

谢谢


-fREW

您只能使用动态SQL读取master.training\u type来生成一个字符串,然后使用
EXEC(@stringvar)
执行该字符串。您只能使用动态SQL读取master.training\u type来生成一个字符串,然后使用
EXEC(@stringvar)执行该字符串

您只能在存储过程中使用动态SQL执行此操作。如果出于安全或其他原因不想动态生成视图或存储过程,您还可以通过代码生成提前生成视图或存储过程。

您只能在存储过程中使用动态SQL。如果出于安全或其他原因不想动态生成视图或存储过程,您还可以通过代码生成提前生成视图或存储过程。

如果表都是相同的结构,请跨表创建一个视图并根据视图进行连接。您需要对列(可能是日期)进行检查约束,以便查询优化程序可以进行分区消除。

如果表都是相同的结构,请跨表创建一个检查约束,并针对视图进行连接。您需要对列(可能是日期)进行检查约束,以便查询优化程序可以执行分区消除。

执行以下操作:

training_data_001
training_data_002
training_data_003
training_data_004
training_data_005
SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_${master.training_type}
ON foo.id = training_data_${master.training_type}.foo_id
create view training_data_all as
select '001' as training_type, * from training_data_001
union all
select '002' as training_type, * from training_data_002
union all
select '003' as training_type, * from training_data_003
union all
select '004' as training_type, * from training_data_004
union all
select '005' as training_type, * from training_data_005
然后只需选择并从中加入:

SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_all
ON foo.id = training_data_all.foo_id
WHERE training_data_all.training_type = ${master.training_type}
如果表列表将随时间增长/收缩,则可以通过对系统表进行一些查找,基于存在的表动态编写相同的视图


但这些都不是很有效。您能否以固定的时间间隔将这些数据ETL到一个组合表中?

执行以下操作:

training_data_001
training_data_002
training_data_003
training_data_004
training_data_005
SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_${master.training_type}
ON foo.id = training_data_${master.training_type}.foo_id
create view training_data_all as
select '001' as training_type, * from training_data_001
union all
select '002' as training_type, * from training_data_002
union all
select '003' as training_type, * from training_data_003
union all
select '004' as training_type, * from training_data_004
union all
select '005' as training_type, * from training_data_005
然后只需选择并从中加入:

SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_all
ON foo.id = training_data_all.foo_id
WHERE training_data_all.training_type = ${master.training_type}
如果表列表将随时间增长/收缩,则可以通过对系统表进行一些查找,基于存在的表动态编写相同的视图


但这些都不是很有效。您能否以固定的时间间隔将这些数据ETL到一个组合表中?

分区视图是一种可能的方法。由于您只选择foo列,您真的只是通过内部联接检查培训表中是否存在行吗?另外,看起来您试图在join中使用foo作为别名,但在SELECT子句中没有这样设置。因此,我在这里猜测你真正想要什么

另一个问题。。。这套培训表是静态的吗?您是否希望能够添加带有新后缀号的新表并使其正常工作

另一种可能的解决办法:

SELECT
     foo
FROM
     dbo.master m
WHERE
     (training_type = '001' AND EXISTS (SELECT * FROM dbo.training_data_001 WHERE foo_id = m.id)) OR
     (training_type = '002' AND EXISTS (SELECT * FROM dbo.training_data_002 WHERE foo_id = m.id)) OR
     (training_type = '003' AND EXISTS (SELECT * FROM dbo.training_data_003 WHERE foo_id = m.id)) OR
     (training_type = '004' AND EXISTS (SELECT * FROM dbo.training_data_004 WHERE foo_id = m.id)) OR
     (training_type = '005' AND EXISTS (SELECT * FROM dbo.training_data_005 WHERE foo_id = m.id))
如果您确实希望从培训数据表中返回列,则可以使用以下方法:

SELECT
     m.id,
     COALESCE(t1.my_col, t2.my_col, t3.my_col, t4.my_col, t5.my_col) AS my_col
FROM
     dbo.master m
LEFT OUTER JOIN dbo.training_data_001 t1 ON m.training_type = '001' AND t1.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_002 t1 ON m.training_type = '002' AND t2.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_003 t1 ON m.training_type = '003' AND t3.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_004 t1 ON m.training_type = '004' AND t4.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_005 t1 ON m.training_type = '005' AND t5.foo_id = m.id

分区视图是一种可能的方法。由于您只选择foo列,您真的只是通过内部联接检查培训表中是否存在行吗?另外,看起来您试图在join中使用foo作为别名,但在SELECT子句中没有这样设置。因此,我在这里猜测你真正想要什么

另一个问题。。。这套培训表是静态的吗?您是否希望能够添加带有新后缀号的新表并使其正常工作

另一种可能的解决办法:

SELECT
     foo
FROM
     dbo.master m
WHERE
     (training_type = '001' AND EXISTS (SELECT * FROM dbo.training_data_001 WHERE foo_id = m.id)) OR
     (training_type = '002' AND EXISTS (SELECT * FROM dbo.training_data_002 WHERE foo_id = m.id)) OR
     (training_type = '003' AND EXISTS (SELECT * FROM dbo.training_data_003 WHERE foo_id = m.id)) OR
     (training_type = '004' AND EXISTS (SELECT * FROM dbo.training_data_004 WHERE foo_id = m.id)) OR
     (training_type = '005' AND EXISTS (SELECT * FROM dbo.training_data_005 WHERE foo_id = m.id))
如果您确实希望从培训数据表中返回列,则可以使用以下方法:

SELECT
     m.id,
     COALESCE(t1.my_col, t2.my_col, t3.my_col, t4.my_col, t5.my_col) AS my_col
FROM
     dbo.master m
LEFT OUTER JOIN dbo.training_data_001 t1 ON m.training_type = '001' AND t1.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_002 t1 ON m.training_type = '002' AND t2.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_003 t1 ON m.training_type = '003' AND t3.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_004 t1 ON m.training_type = '004' AND t4.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_005 t1 ON m.training_type = '005' AND t5.foo_id = m.id

WHERE子句位于所有联接之后WHERE子句位于所有联接之后