ЛЕВЫЙ ПРИСОЕДИНЯЙТЕСЬ ТОЛЬКО ДЛЯ КОНКРЕТНЫХ РЯДОВ В SQL? - PullRequest
2 голосов
/ 01 июня 2011

У меня есть еще одна довольно любопытная проблема.У меня есть следующая структура:

CREATE TABLE [dbo].[Event]
(
    Id int IDENTITY(1,1) NOT NULL,
    ApplicationId nvarchar(32) NOT NULL,
    Name nvarchar(128) NOT NULL,
    Description nvarchar(256) NULL,
    Date nvarchar(16) NOT NULL,
    Time nvarchar(16) NOT NULL,
    EventType nvarchar(16) NOT NULL,
    SourceId int NOT NULL,
    CONSTRAINT Event_PK PRIMARY KEY CLUSTERED ( Id ) WITH (
        PAD_INDEX = OFF, 
        STATISTICS_NORECOMPUTE = OFF, 
        IGNORE_DUP_KEY = OFF, 
        ALLOW_ROW_LOCKS = ON, 
        ALLOW_PAGE_LOCKS  = ON
    ),
    CONSTRAINT Event_Source FOREIGN KEY (SourceId) REFERENCES [dbo].[Source](Id)
)

CREATE TABLE [dbo].[Source]
(
    Id int IDENITY(1,1) NOT NULL,
    Name nvarchar(128) NOT NULL,
    Description nvarchar(256) NULL,
    CONSTRAINT Source_PK PRIMARY KEY CLUSTERED ( Id ) WITH (
        PAD_INDEX = OFF, 
        STATISTICS_NORECOMPUTE = OFF, 
        IGNORE_DUP_KEY = OFF, 
        ALLOW_ROW_LOCKS = ON, 
        ALLOW_PAGE_LOCKS  = ON
    )
)

Данные из таблицы событий должны отображаться в сетке.В моем предыдущем вопросе я узнал, как правильно запрашивать и отображать данные, при этом отображая только последнюю запись для ApplicationId (иначе ... группируя ее и отображая последнюю запись для каждой группы).(/4139905/kak-poluchit-poslednyy-zapis-na-gruppu-v-sql) Спасибо @Anthony Faull, @Damien_The_Unbeliever и всем остальным, кто способствовал этому ответу.

К сожалению, новое требование было добавлено ко мне и включает поля SourceId и EventType этой таблицы.

По сути, новое требование гласит, что для определенного значения в столбце EventType ('APP_CLOSE' и 'APP_START') выберите Имя источника. Для всего остального выведите «NULL» или какое-либо другое предопределенное значение.

Я пытаюсь создать представление, которое будет соответствовать этому запросу, и попытался с помощью LEFT OUTER JOIN. Проблема в том, что некоторые записи в таблице событий имеют значения в SourceId, а я не получаю данные, доставленныеПРИСОЕДИНЯЙТЕСЬ к этим записям, если в поле EventType не указано «APP_CLOSE» или «APP_START».

Есть идеи, как это сделать?*

Так как кто-то указал, что я отстой, объясняя, в чем проблема, я решил сделать продолжение:

Событие:

| Id | ApplicationId  | Name  | Description | Date       |Time     | EventType | SourceId |
+----+----------------+-------+-------------+------------+---------+-----------+----------+
|1   |2202            |XYZ    | Test        | 05/31/2011 |10:30:55 | APP_CLOSE | 2        |
+----+----------------+-------+-------------+------------+---------+-----------+----------+
|2   |2709            |zyx    | Test        | 05/31/2011 |11:27:55 | APP_START | 4        |
+----+----------------+-------+-------------+------------+---------+-----------+----------+
|3   |2709            |zyx    | Test        | 05/31/2011 |17:09:55 | APP_PAUSE | 1        |

Исходная таблица:

| Id | Name              | Description |
+----+-------------------+-------------+
| 2  | Process Watcher   |             |
+----+-------------------+-------------+
| 4  | Interrupt Handler |             |
+----+-------------------+-------------+
| 1  | User Input        |             |
+----+-------------------+-------------+

Результат (запрос или просмотр):

| Id | ApplicationId  | Name  | Description | Date       |Time     | EventType | Source Name          |
+----+----------------+-------+-------------+------------+---------+-----------+----------------------+
|1   |2202            |XYZ    | Test        | 05/31/2011 |10:30:55 | APP_CLOSE | Process Watcher      |
+----+----------------+-------+-------------+------------+---------+-----------+----------------------+
|2   |2709            |zyx    | Test        | 05/31/2011 |11:27:55 | APP_START | Interrupt Handler    |
+----+----------------+-------+-------------+------------+---------+-----------+----------------------+
|3   |2709            |zyx    | Test        | 05/31/2011 |17:09:55 | APP_PAUSE |                      |       

Идея состоит в том, что даже если пользователь может приостановить приложение, пользователь неощутимая часть программного обеспечения.Поэтому при составлении отчетов о произошедших событиях я могу сообщать только о событиях, вызванных компонентами программного обеспечения.Другими словами, мне нужно только ввести имя источника на основе определенных типов событий (APP_CLOSE и APP_START) на данный момент.

Спасибо,

Мартин

Ответы [ 3 ]

3 голосов
/ 01 июня 2011
select e.*, s.Name, ISNULL(s.Name,'Predefined Value')
from [Event] as e
left join [Source] as s on (s.Id = e.SourceId)
                       and (e.EventType in ('APP_CLOSE','APP_START'))
0 голосов
/ 01 июня 2011
select * from [dbo].[Source] right outer join [dbo].[Event]
on [dbo].[Source].Id = [Event].id 
and ([dbo].[Event].EventType  = 'APP_CLOSE' 
OR [dbo].[Event].EventType  = 'APP_START')

Это покажет каждый столбец события и значения источника только если eventtype = 'APP_CLOSE' или 'APP_START'

Это то, что вы хотите?*

0 голосов
/ 01 июня 2011

Если я вас понимаю, у вас есть значение, и если это определенное значение, покажите его, иначе покажите ноль:

Это просто, просто используйте оператор case

Выберите случай, когда col = 5, тогда 'FIVE жив!'еще "Это просто джайв!"конец из таблицы

...