Оптимизация. Без Union получится?

Nick_nsk
Дата: 13.09.2006 12:47:33
Две связанные таблицы. Необходимо вытащить A_id для заданного Name_A независимо от результатов запроса
Написанный Select с Union при наличии признака 'мясо' отдает его в ПЕРВОЙ строке,
количество возвращаемых строк не суть важно.
При отсутствии признака ОБЯЗАТЕЛЬНО возвращает A_id для для заданного Name_A

Можно оптимизировать запрос?




USE [tempdb]
GO
/****** Object: Table [dbo].[Animals] Script Date: 09/13/2006 15:12:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Animals](
[A_Id] [int] NOT NULL,
[Name_A] [char](15) COLLATE SQL_Latin1_General_CP1251_CI_AS NOT NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[Pitanie] Script Date: 09/13/2006 15:13:36 ******/
CREATE TABLE [dbo].[Pitanie](
[Id] [int] NOT NULL,
[P_name] [char](15) COLLATE SQL_Latin1_General_CP1251_CI_AS NOT NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO

INSERT INTO animals (a_id,Name_A) VALUES (1,'кошка')
INSERT INTO animals (a_id,Name_A) VALUES (2,'корова')
INSERT INTO animals (a_id,Name_A) VALUES (3,'собака')
INSERT INTO animals (a_id,Name_A) VALUES (4,'курица')
INSERT INTO animals (a_id,Name_A) VALUES (5,'лев')

INSERT INTO Pitanie (id,P_name) VALUES (1,'мясо')
INSERT INTO Pitanie (id,P_name) VALUES (1,'молоко')
INSERT INTO Pitanie (id,P_name) VALUES (2,'сено')
INSERT INTO Pitanie (id,P_name) VALUES (3,'хлеб')
INSERT INTO Pitanie (id,P_name) VALUES (3,'мясо')
INSERT INTO Pitanie (id,P_name) VALUES (3,'кости')
INSERT INTO Pitanie (id,P_name) VALUES (4,'пшено')

/* Типичный селект: */

SELECT a_id,name_a,p_name FROM animals
LEFT JOIN pitanie ON a_id=id


DECLARE @Anml char(15),@Prdkt char(15)

select @Anml='кошка',@Prdkt='мясо'
/*select @Anml='кошка',@Prdkt='червяки'*/
/*select @Anml='лев',@Prdkt='мясо'*/


select a_id,name_a,p_name,1 as ord from animals,pitanie where a_id=id and name_a=@Anml and p_name=@Prdkt
UNION select a_id,' ',' ',2 as ord from animals where name_a=@Anml order by ord
go
Glory
Дата: 13.09.2006 12:51:07
может лучше использовать LEFT OUTER JOIN ?
Nick_nsk
Дата: 13.09.2006 12:53:34
Два условия втиснуть не получается. при запросе
@Anml='лев',@Prdkt='мясо'
не отдается A_id
:(
Nick_nsk
Дата: 13.09.2006 13:17:17
Извиняюсь. При вставке ушли пробелы. Работающий запрос:

select a_id,name_a,p_name,1 as ord from animals,pitanie where a_id=id and name_a=@Anml and p_name=@Prdkt
UNION select a_id,' ',' ',2 as ord from animals where name_a=@Anml order by ord
Basill
Дата: 13.09.2006 13:21:28
не ясна проблема
какой результат необходимо получить?
Nick_nsk
Дата: 13.09.2006 13:25:21
Требуется в один запрос втиснуть две сущности:
1. Считать A_ID по запросу Name_A='лев'
2. Убедиться, что в связанной таблице у льва есть / нет 'мясо'
Glory
Дата: 13.09.2006 13:26:00
Nick_nsk
Требуется в один запрос втиснуть две сущности:
1. Считать A_ID по запросу Name_A='лев'
2. Убедиться, что в связанной таблице у льва есть / нет 'мясо'

ну дык left join, однозначно
Nik V. Polonski
Дата: 13.09.2006 13:29:45
не оно?
select a_id,name_a,p_name
from
	animals a
	left outer join
	pitanie p on
		a.a_id = p.id
		and
		p_name=@Prdkt
where
	a.name_a=@Anml
Nick_nsk
Дата: 13.09.2006 13:33:05
Спасибо, работает!
Я сам крапал:

select a_id,name_a,p_name from Animals
left join Pitanie on a_id=id
where name_A='лев' and P_name='мясо'

Но результат был не тот...
Basill
Дата: 13.09.2006 13:33:08
select a_id, name_a, isnull(p_name, '') as p_name
from animals 
left join pitanie on animals.a_id=pitanie.id
where name_a=@Anml and (p_name is null or p_name=@Prdkt)

результат:
a_id name_a p_name
5 лев