SQL JOIN基于表内容

时间:2015-10-19 20:38:05

标签: sql sql-server

我有一个表,其中包含对包含答案的另一个表和字段的相应引用的问题。类似的东西:

enter image description here

我想查询问题表并返回QID,QuestionText以及每个QID的[ResponseTable]。[ResponseField]中包含的值。当时设计灵活多变。然而,应用程序开发人员期待一个存储过程,并且SQL开发人员正在依靠针对此问题的in app解决方案。

我正在试图构建此查询。你会如何建议完成这项任务?

3 个答案:

答案 0 :(得分:0)

听起来应该考虑重新设计(例如,将所有回复存储在一个表中),但如果不可能,则可以使用https://github.com/DISTORTEC/distortos/tree/master/include/distortos。但是,使用它可能很危险,因为它容易受到dynamic SQL (using sp_executesql)的攻击。可以采取一些预防措施,例如在表名和列名上使用SQL injection。在使用动态SQL之前,这也是一个很好的阅读:QUOTENAME

DECLARE @tableName NVARCHAR(50)
DECLARE @columnName NVARCHAR(50)
DECLARE @query NVARCHAR(MAX)

SET @tableName = 'Client1'
SET @columnName = 'ColorPref'
SET @query = 'SELECT ' + QUOTENAME(@columnName) + ' FROM ' + QUOTENAME(@tableName)

EXEC sp_executesql @query

答案 1 :(得分:0)

我认为你不会听到这个答案,因为它可能意味着一些重大的返工,但我认为这是正确的答案。摆脱问题表并将问题放入Client1,Client9和Jobs表中的新Question字段中;每个回复一个。

例如,Client1表将包含以下字段:

{{1}}

......等等

解决这个设计将是可以管理的,因为解决你现在的设计将会很头疼。

答案 2 :(得分:0)

在进行上述改写之前,请考虑使用视图将这些响应表组合在一起的想法。

CREATE VIEW ClientResponses AS
    SELECT QID, ResponseField FROM [Client1]
    UNION
    SELECT QID, ResponseField FROM [Jobs]
    UNION
    SELECT QID, ResponseField FROM [Client9]
    -- ..... add the new tables as they are created

这将

  1. 避免动态SQL
  2. 为您提供一个维护查询的地方
  3. 提供一种非常简单易读的方法来阻止这种情况