我想将自己视为一个体面的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,但这对我来说似乎不对。
任何想法都会有所帮助。
答案 0 :(得分:2)
我将其更改为使用EXISTS(SELECT * ....) OR EXISTS(SELECT * ....)
而不是SELECT(MAX)
商家,但除此之外我觉得还不错。
SQL Server可能会显示一个带有连接运算符的计划,该运算符根据my tests here将OR
短路。我还发现,无论条款的顺序如何,它都会测试在这种情况下首先评估的更便宜的一个。
答案 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]
代替。