使用表用于多个查询参数

时间:2017-01-10 15:55:21

标签: sql-server

我正在尝试清理一个巨大的现有SQL脚本,该脚本由多个SQL查询组成,每个SQL查询从一个表中获取大量记录并将它们附加到"输出表&# 34 ;.在我看来,创建一个查询以便立即获取所有记录会更容易。问题是,这些现有查询中的每一个都在其WHERE子句中使用各种标准。

我想知道我是否可以简单地创建一个包含所有WHERE条件的表,然后编写一些使用所有这些条件的SQL语句。然后,如果必须更改标准,我可以编辑或添加到该表,而不必经历并重写SQL。

例如,现在它就像:

INSERT INTO SelectedCustomers (CustomerID)
SELECT CustomerID FROM Customers WHERE CustomerName LIKE '%Jones%' AND CustomerAge > '18'

然后继续那里:

INSERT INTO SelectedCustomers (CustomerID)
SELECT CustomerID FROM Customers WHERE CustomerState = 'CT' OR CustomerHair = 'Brown'

进一步向下:

INSERT INTO SelectedCustomers (CustomerID)
SELECT CustomerID FROM Customers WHERE CustomerState = 'NY' AND CustomerHair <> 'Red'

等(它继续......)

任何想法,链接等?

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点 - 如果标准总是相同的(例如LIKE '%Jones%'CustomerAge > '18'),那么你所说的是内部联接。

由于您的标准似乎变化很大,我不建议(可以使用动态sql完成,但在我看来,这只会让您的系统更难维护和更慢。)

而是我建议的,因为您的示例仅显示基于来自一个表的视图的ID的选择,然后基于该视图的插入表的连接。当您的条件更改时,更改视图。这看起来像这样。

  CREATE OR REPLACE VIEW INSERT_CRITERIA (CustomerID) AS

    SELECT CustomerID FROM Customers WHERE CustomerName LIKE '%Jones%' AND CustomerAge > '18'
      UNION 
    SELECT CustomerID FROM Customers WHERE CustomerState = 'CT' OR CustomerHair = 'Brown'
      UNION 
    SELECT CustomerID FROM Customers WHERE CustomerState = 'NY' AND CustomerHair <> 'Red'

然后插入只是

INSERT INTO SelectedCustomers (CustomerID)
   SELECT CustomerID FROM INSERT_CRITERIA

这里的优点是您可以将业务规则(例如CustomerState = 'CT')移除到易于管理和监控的位置,同时仍然可以获得编译器能够优化这些功能的优势。

如果你真的想要自动化它,我仍然会建议这个视图 - 只需从存储业务规则的表中生成视图。创建/更新视图很容易编写脚本。