2012-03-21 64 views
1

我想把自己當作一個體面的SQL Server程序員,但是這個查詢總是讓我感到困惑。我相信有一個更好的方法來查詢這個。這是我能用我的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,但這對我來說似乎是錯誤的。

任何想法都會有所幫助。

回答

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]來代替。

+0

有沒有辦法通過加入3個表來做到這一點?我認爲我們可以但不能包圍我的頭圍繞邏輯​​ – darwindeeds 2012-03-21 16:00:02

+0

不知道我明白。你不能添加更多'EXISTS'子句嗎?您需要爲關於這些其他表格的問題添加信息,以及它們如何相關以獲得任何有用的輸入。 – 2012-03-21 16:37:23

2

我會更改它使用EXISTS(SELECT * ....) OR EXISTS(SELECT * ....)而不是SELECT(MAX)業務,但除此之外看起來還可以。

SQL Server可能會顯示計劃與連接運算符根據my tests here短路OR。我也發現,無論條款的順序如何,在這種情況下,它都會首先測試便宜的評估。

相關問題