2017-03-14 14 views
1

私はトリッキーなものを持っています。t1のフィールドがt2に存在しないレコードを選択しますが、t1フィールドがNULLの場合は無視します。

VoucherCode | Category | Size | Colour | Gender 
0001  | Shirt  | NULL | Green | Male 
0002  | Shirt  | 12 | NULL | Male 
0003  | Shirt  | 12 | Blue | NULL 
0004  | Shirt  | NULL | NULL | NULL 
0005  | Shorts | NULL | Brown | Male 
0006  | Shorts | 10 | NULL | Male 
0007  | Shorts | 12 | Green | NULL 
0008  | Shorts | NULL | NULL | NULL 
0009  | Pants  | NULL | Pink | Female 
0010  | Pants  | 10 | NULL | Male 
0011  | Pants  | 12 | Purple | NULL 
0012  | Pants  | NULL | NULL | NULL 

表2: 私はテーブル

表1に二組有する

ProductCode | Category | Size | Colour | Gender 
0001  | Shirt  | 10 | Blue | Male 
0002  | Shorts | 13 | Brown | Female 
0003  | Pants  | 10 | Purple | Male 
0004  | Pants  | 10 | Purple | Female 

最初の表は、リスト券であるが、第二の表は、製品のリストです。 私はバウチャーのリストを返すクエリを書く必要があり、それはうまくいかないでしょう。

伝票の特定の属性は、リテラルの代わりにNULLとすることができます。これは、定義されている他の属性の任意の組み合わせのためのものです。

例:

VoucherCode 0001 できない作業シャツ、緑の色、および男性

の性別のカテゴリに商品はありませんので、VoucherCode 0004 でし仕事があるので、シャツのカテゴリの製品です。

これを考慮すると、おそらくはうまくいかない表1のすべてのレコードを返すクエリを作成する必要があります。

結果はこのように見て

VoucherCode | Category | Size | Colour | Gender 
0001  | Shirt  | NULL | Green | Male 
0002  | Shirt  | 12 | NULL | Male 
0003  | Shirt  | 12 | Blue | NULL 
0005  | Shorts | NULL | Brown | Male 
0006  | Shorts | 10 | NULL | Male 
0007  | Shorts | 12 | Green | NULL 
0009  | Pants  | NULL | Pink | Female 
0011  | Pants  | 12 | Purple | NULL 

誰もが、私はこれを達成できる方法任意のアイデアを持っていますか?

+0

タグあなたの質問をデータベースであなたは使用しています。 –

+0

出力に含まれるために各伝票が満たす必要のあるルール、述語または式を書き留めます。例が役に立ちますが、ルールを最初に定義する必要があります。 –

+0

あなたの説明は*ほぼ*完璧です。しかし、あなたはテーブルt1にバウチャー3,4,8をリストすることを忘れてしまったようです。彼らはあなたの解決策にしか現れません。 – cars10m

答えて

1

一つの方法は、左を使用している、これはあなたの結果を得るために解決することができます(ただし、私はそれをテストしていない)と思います。

クエリ

DECLARE @Voucher as TABLE 
(
    VoucherCode char(4), 
    Category varchar(10), 
    Size int, 
    Colour varchar(10), 
    Gender varchar(6)  
) 

INSERT INTO @Voucher VALUES 

('0001', 'Shirt', NULL, 'Green', 'Male'), 
('0002', 'Shirt', 12 , NULL, 'Male'), 
('0003', 'Shirt', 12 , 'Blue', NULL), 
('0004', 'Shirt', NULL, NULL, NULL), 
('0005', 'Shorts', NULL, 'Brown', 'Male'), 
('0006', 'Shorts', 10 , NULL, 'Male'), 
('0007', 'Shorts', 12 , 'Green', NULL), 
('0008', 'Shorts', NULL, NULL, NULL), 
('0009', 'Pants', NULL, 'Pink', 'Female'), 
('0010', 'Pants', 10 , NULL, 'Male'), 
('0011', 'Pants', 12 , 'Purple', NULL), 
('0012', 'Pants', NULL, NULL, NULL) 


DECLARE @Product as TABLE 
(
    ProductCode char(4), 
    Category varchar(10), 
    Size int, 
    Colour varchar(10), 
    Gender varchar(6)  
) 

INSERT INTO @Product VALUES 
('0001', 'Shirt', 10, 'Blue', 'Male'), 
('0002', 'Shorts', 13, 'Brown', 'Female'), 
('0003', 'Pants', 10, 'Purple', 'Male'), 
('0004', 'Pants', 10, 'Purple', 'Female') 

(私たちのセーブくださいあなたの将来の質問では、このステップを)サンプルテーブルを作成し、移入:

SELECT V.VoucherCode, 
     V.Category, 
     V.Size, 
     V.Colour, 
     V.Gender 
FROM @Voucher V 
LEFT JOIN @Product P 
ON V.Category = P.Category 
AND ISNULL(V.Size, P.Size) = P.Size 
AND ISNULL(V.Colour, P.Colour) = P.Colour 
AND ISNULL(V.Gender, P.Gender) = P.Gender 
WHERE P.ProductCode IS NULL 

結果:

VoucherCode Category Size Colour Gender 
0001  Shirt  NULL Green Male 
0002  Shirt  12  NULL Male 
0003  Shirt  12  Blue NULL 
0005  Shorts  NULL Brown Male 
0006  Shorts  10  NULL Male 
0007  Shorts  12  Green NULL 
0009  Pants  NULL Pink Female 
0011  Pants  12  Purple NULL 
+0

私はちょうどあなたがちょうどやったことを正確にタイピングを開始しようとしていた...私は将来それを行うだろう...それは素晴らしいです:)非常にありがとう! –

0

私がnullであると参加それを行うには

SELECT v.* 
FROM Vouchers AS v 
    LEFT OUTER JOIN Products AS p 
    ON v.Category = p.category AND 
     ISNULL(v.Size, -1) = ISNULL(p.Size, -1) AND 
     ISNULL(v.Colour, '-1') = ISNULL(p.Colour, '-1') AND 
     ISNULL(v.Gender, '-1') = ISNULL(p.Gender, '-1') 
WHERE p.ProductCode IS NULL 
+0

サンプルデータをクリアした後、このコードサンプルは機能しません。 – Kevin

関連する問題