这是我用SQL Server查询从多个表中提取数据的最佳方法吗?

时间:2012-03-21 15:20:39

标签: sql-server sql-server-2008

我想将自己视为一个体面的SQL Server程序员,但这个查询总是让我感到困惑。我确信有更好的方法来查询它。

SELECT DISTINCT
    database_name,
    CASE 
        WHEN ((SELECT MAX(1) FROM dbo.column_list WHERE column_list IS NOT NULL and database_id = d.database_id) = 1 
                OR (SELECT MAX(1) FROM dbo.table_list WHERE table_list IS NOT NULL and database_id = d.database_id) = 1) 
            THEN 1 
            ELSE 0 
    END AS 'has_definition'
FROM dbo.database_list d;

我有3个表database_list,table_list和column_list。我正在尝试查询数据库列表中的给定数据库,以查看是否有任何基础表或列中有定义。这个查询现在可以工作,并返回一个唯一的数据库列表和一个has_definition,但这对我来说似乎不对。

任何想法都会有所帮助。

2 个答案:

答案 0 :(得分:2)

我将其更改为使用EXISTS(SELECT * ....) OR EXISTS(SELECT * ....)而不是SELECT(MAX)商家,但除此之外我觉得还不错。

SQL Server可能会显示一个带有连接运算符的计划,该运算符根据my tests hereOR短路。我还发现,无论条款的顺序如何,它都会测试在这种情况下首先评估的更便宜的一个。

答案 1 :(得分:1)

您可以尝试使用此版本:

SELECT database_name,
    CASE WHEN EXISTS 
    (
      SELECT 1 FROM dbo.column_list 
         WHERE column_list IS NOT NULL and database_id = d.database_id
      UNION ALL
      SELECT 1 FROM dbo.table_list 
         WHERE table_list IS NOT NULL and database_id = d.database_id
    ) 
            THEN 1 
            ELSE 0 
    END AS [has_definition]
FROM dbo.database_list AS d;

也许可以将其与此相提并论:

SELECT database_name,
    CASE WHEN EXISTS 
    (
      SELECT 1 FROM dbo.column_list 
         WHERE column_list IS NOT NULL and database_id = d.database_id
    ) 
    OR EXISTS
    (
      SELECT 1 FROM dbo.table_list 
         WHERE table_list IS NOT NULL and database_id = d.database_id
    ) 
            THEN 1 
            ELSE 0 
    END AS [has_definition]
FROM dbo.database_list AS d;

除非你dbo.database_list中确实有重复项,否则我认为你不需要明确的。

另请不要将'single quotes'用于别名 - 不推荐使用此语法,而应使用[square brackets]代替。