Это лучшее, что я могу сделать с моим запросом SQL Server, который извлекает данные из нескольких таблиц? - PullRequest
1 голос
/ 21 марта 2012

Я хотел бы думать о себе как о приличном программисте 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 ]

2 голосов
/ 21 марта 2012

Я бы поменял его на использование EXISTS(SELECT * ....) OR EXISTS(SELECT * ....), а не на SELECT(MAX) бизнес, но в остальном для меня это выглядит нормально.

SQL Server, вероятно, покажет план с оператором конкатенации, который замыкает OR согласно моим тестам здесь . Я также обнаружил, что в этом случае сначала будет проверяться более дешевый вариант, независимо от порядка пунктов.

1 голос
/ 21 марта 2012

Вместо этого вы можете попробовать эту версию:

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].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...