SQL 查询 - 来自字段的表

发布于 2024-12-23 02:14:17 字数 521 浏览 2 评论 0原文

这就是我的情况。我有不同的表,例如:

TABLE A

Name | Phone              
John   123   
Mick   233

TABLE B

Department | Position          
IT            xxx   
HR            yyy

下一个配置表是通过网络动态创建的:

TABLE C

Source | Field  
TABLE A    Name   
TABLE B    Department

当我运行应用程序中,我读取了表 C 并且需要生成数据。 在这种情况下,我需要列出表 A 中的所有名称和表 B 中的所有部门。

我该如何查询?我希望有人能帮助我。

干杯!

This is my situation. I have different tables, by example:

TABLE A

Name | Phone              
John   123   
Mick   233

TABLE B

Department | Position          
IT            xxx   
HR            yyy

And the next configuration table is created dynamically via web:

TABLE C

Source | Field  
TABLE A    Name   
TABLE B    Department

When I run the application, I read the Table C and I need to generate the data.
In this case, I need to list all the names from TABLE A and all the departments from TABLE B.

How can I query this? I hope somebody can help me.

Cheers!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦中的蝴蝶 2024-12-30 02:14:17

如果您必须在 sql 中执行此操作(如果您不能信任 TABLE C 的内容,我不会建议这样做),那么您将需要构造一个包含 sql 查询的变量,然后动态执行该 sql 查询。如何做到这一点完全取决于您的 DBMS。 MySQL 中的一个示例(假设表 C 只有一行):

SELECT @sql:=CONCAT("SELECT ",field," FROM ",source) FROM TABLE_C;
PREPARE s1 FROM @sql;
EXECUTE s1;

SQL Server 语法:

DECLARE @sql nvarchar(max)
SELECT @sql = "SELECT " + field + " FROM " + source FROM TABLE_C
EXEC sp_executesql @sql
GO

由于表 C 肯定有不止一行,因此您必须迭代表 C。这可以通过 CURSOR 来完成,然后再次使用确切的细节取决于您的 DBMS。

重要的是,请注意,如果您声明表 C 是从网络创建的,那么这是非常危险的。您无法保证 FIELD 和 SOURCE 字段中的内容:任何具有一点 SQL 知识的人都可能会利用 sql 注入攻击来填充它们。您可能需要做的是通过安全参数化的数据库元查询安全地验证 TABLE C 的内容是否是实际的表/列。

If you have to do this in sql - which I would not recommend if you can not trust the content of TABLE C - then you will need to construct a variable that contains the sql query, then execute that sql query dynamically. How to do this will entirely depend on your DBMS. An example in MySQL (which assumes that TABLE C has only one row):

SELECT @sql:=CONCAT("SELECT ",field," FROM ",source) FROM TABLE_C;
PREPARE s1 FROM @sql;
EXECUTE s1;

SQL Server syntax:

DECLARE @sql nvarchar(max)
SELECT @sql = "SELECT " + field + " FROM " + source FROM TABLE_C
EXEC sp_executesql @sql
GO

Since TABLE C will certainly have more than one row you will have to iterate through TABLE C. This can be done with a CURSOR, and again the exact details will be dependent on your DBMS.

Importantly, be aware that this is very dangerous if as you state TABLE C is created from the web. You have no guarantee what is in the FIELD and SOURCE fields: they could be filled with a sql injection attack by anyone with a little SQL knowledge. What you may need to do is safely validate that TABLE C's contents are actual tables/columns via safely parameterized database meta-queries.

梦在深巷 2024-12-30 02:14:17
 select ta.Name, tb.Department 
 from TABLEA ta, TABLEB  tb
 select ta.Name, tb.Department 
 from TABLEA ta, TABLEB  tb
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文