2015-02-02 3 views
0

테이블이 3 개 있습니다 : 요리법 (1 --- *) Ingridients (* --- 1) 제품. 주어진 목록에 제품이 있거나 목록에 없지만 특정 플래그가 설정된 제품을 포함하는 요리법을 얻어야합니다. 나는 제품 표 (bool)에 깃발을 가지고 있습니다.3 개의 테이블 중에서 선택하십시오 (1 대 다수, 1 대 관계)

중요
WHERE Product.Caption IN ('A', 'B', 'C') OR (Product.Caption NOT IN ('A', 'B', 'C') AND Product.Flag=TRUE) 

은 다음과 같습니다 : 절처럼 보이는 곳 그래서 나는 목록에서 제품을 포함하며 (안 목록 및 플래그가 false) 다른 제품을 포함 조리법이 필요하지 않습니다.

USE [master] 
IF EXISTS (SELECT * FROM master.dbo.sysdatabases WHERE name = N'movedb') ALTER DATABASE [movedb] SET SINGLE_USER With ROLLBACK IMMEDIATE 
IF EXISTS (SELECT * FROM master.dbo.sysdatabases WHERE name = N'movedb') DROP DATABASE [movedb] 
IF NOT EXISTS (SELECT * FROM master.dbo.sysdatabases WHERE name = N'movedb') CREATE DATABASE [movedb] 
USE [movedb] 

-- 
-- Table structure for table 'Ingridients' 
-- 

IF object_id(N'Ingridients', 'U') IS NOT NULL DROP TABLE [Ingridients] 

CREATE TABLE [Ingridients] (
    [Id] INT NOT NULL IDENTITY, 
    [Quantity] INT DEFAULT 0, 
    [IdProduct] INT DEFAULT 0, 
    [IdRecipe] INT DEFAULT 0, 
    PRIMARY KEY ([Id]) 
) 

SET IDENTITY_INSERT [Ingridients] ON 
GO 

-- 
-- Dumping data for table 'Ingridients' 
-- 

INSERT INTO [Ingridients] ([Id], [Quantity], [IdProduct], [IdRecipe]) VALUES (1, 0, 1, 2) 
INSERT INTO [Ingridients] ([Id], [Quantity], [IdProduct], [IdRecipe]) VALUES (2, 0, 3, 2) 
INSERT INTO [Ingridients] ([Id], [Quantity], [IdProduct], [IdRecipe]) VALUES (3, 0, 4, 2) 
INSERT INTO [Ingridients] ([Id], [Quantity], [IdProduct], [IdRecipe]) VALUES (4, 0, 6, 2) 
INSERT INTO [Ingridients] ([Id], [Quantity], [IdProduct], [IdRecipe]) VALUES (5, 0, 2, 3) 
INSERT INTO [Ingridients] ([Id], [Quantity], [IdProduct], [IdRecipe]) VALUES (6, 0, 4, 3) 
INSERT INTO [Ingridients] ([Id], [Quantity], [IdProduct], [IdRecipe]) VALUES (7, 0, 8, 3) 
INSERT INTO [Ingridients] ([Id], [Quantity], [IdProduct], [IdRecipe]) VALUES (8, 0, 1, 4) 
INSERT INTO [Ingridients] ([Id], [Quantity], [IdProduct], [IdRecipe]) VALUES (9, 0, 6, 4) 
INSERT INTO [Ingridients] ([Id], [Quantity], [IdProduct], [IdRecipe]) VALUES (10, 0, 5, 4) 
-- 10 records 

SET IDENTITY_INSERT [Ingridients] OFF 
GO 

-- 
-- Table structure for table 'Products' 
-- 

IF object_id(N'Products', 'U') IS NOT NULL DROP TABLE [Products] 

CREATE TABLE [Products] (
    [Id] INT NOT NULL IDENTITY, 
    [Caption] NVARCHAR(255), 
    [EasyToFind] BIT DEFAULT 0, 
    PRIMARY KEY ([Id]) 
) 

SET IDENTITY_INSERT [Products] ON 
GO 

-- 
-- Dumping data for table 'Products' 
-- 

INSERT INTO [Products] ([Id], [Caption], [EasyToFind]) VALUES (1, N'ProductA', 0) 
INSERT INTO [Products] ([Id], [Caption], [EasyToFind]) VALUES (2, N'ProductB', 0) 
INSERT INTO [Products] ([Id], [Caption], [EasyToFind]) VALUES (3, N'ProductC', 0) 
INSERT INTO [Products] ([Id], [Caption], [EasyToFind]) VALUES (4, N'ProductD', -1) 
INSERT INTO [Products] ([Id], [Caption], [EasyToFind]) VALUES (5, N'ProductE', 0) 
INSERT INTO [Products] ([Id], [Caption], [EasyToFind]) VALUES (6, N'ProductF', -1) 
INSERT INTO [Products] ([Id], [Caption], [EasyToFind]) VALUES (7, N'ProductG', 0) 
INSERT INTO [Products] ([Id], [Caption], [EasyToFind]) VALUES (8, N'ProductH', 0) 
INSERT INTO [Products] ([Id], [Caption], [EasyToFind]) VALUES (9, N'ProductI', 0) 
INSERT INTO [Products] ([Id], [Caption], [EasyToFind]) VALUES (10, N'ProductJ', 0) 
-- 10 records 

SET IDENTITY_INSERT [Products] OFF 
GO 

-- 
-- Table structure for table 'Recipes' 
-- 

IF object_id(N'Recipes', 'U') IS NOT NULL DROP TABLE [Recipes] 

CREATE TABLE [Recipes] (
    [Id] INT NOT NULL IDENTITY, 
    [Caption] NVARCHAR(255), 
    PRIMARY KEY ([Id]) 
) 

SET IDENTITY_INSERT [Recipes] ON 
GO 

-- 
-- Dumping data for table 'Recipes' 
-- 

INSERT INTO [Recipes] ([Id], [Caption]) VALUES (2, N'RecipeA') 
INSERT INTO [Recipes] ([Id], [Caption]) VALUES (3, N'RecipeB') 
INSERT INTO [Recipes] ([Id], [Caption]) VALUES (4, N'RecipeC') 
-- 3 records 

SET IDENTITY_INSERT [Recipes] OFF 
GO 

는 예 : 내가 ProductA 및 ProductE를 검색 할 경우 그것이 지금

내가 MySQL 용 이런 일이 나에게 유일한 RecipeC을 주어야한다 (

우는 소리는 MSSQL에 대한 예제 데이터베이스 덤프입니다 최종으로는 아니며, ID로만 작동 할 수 있습니다. 제품 캡션으로만 작동하도록 변경하고 MSSQL에 맞게 조정할 수 있습니다.

+0

제목을보다 구체적으로 만들어보세요. "복합 요청"은 아무런 의미가 없습니다. 복합체와 같은 단어를 사용하지 않으려 고 노력하십시오. 복잡 할 수도있는 것은 다른 것에 대한 케이크 일 수 있으며 문제를 설명하는 데 도움이되지 않습니다. – Fred

+0

예. 감사합니다. 지금 바로 수정하겠습니다. –

+0

무엇이 문제입니까? 데이터베이스를 만들 스크립트 ("필요 없음"), OK 일 수있는 WHERE 문, 전체 쿼리가 없거나 문제가 무엇인지 게시했습니다. @Fred가 언급했듯이, 이것은 전혀 복잡하지 않으며, 당신은 단지 세 개의 테이블을 결합합니다. –

답변

3

다음 sql은 목록에있는 제품 이외의 제품이 없거나 P.EasyToFind = -1 인 레서피를 가져옵니다.

select * 
From Recipes 
Where Id not in 
(
select IdRecipe 
from Ingridients I 
inner join Products P ON I.IdProduct = P.Id 
where P.Caption NOT IN ('ProductA','ProductE') 
and P.EasyToFind=0 
) 

불필요한 성분을 식별하는 내부 쿼리가 있고 그 중 하나와 일치하지 않는 레시피를 가져 오는 방식으로 작동합니다.

+0

그냥 초 보자;) –

+0

완벽하게 작동합니다. 감사합니다. –