1

部品のサプライヤーに関する情報を含むテーブルがあります

背景: このテーブルは

  • を含む部品マスタ レコード
    • 部品番号、部品名、およびデフォルトのサプライヤー。
  • もう 1 つのテーブルは、以下を含むサプライヤー情報テーブルです。
    • サプライヤに対する部品番号とその部品の見積もりの​​記録 (この例では省略した追加情報があります)

この表では、一部のパーツのデフォルトのサプライヤーが NULL です。これらのレコードについて、プレースホルダーとして新しいレコードを挿入したいと思います。つまり、以下の #3 です。

一部の部品にはデフォルトのサプライヤがありますが、可能なサプライヤの記録はありません (見積あり)。これらのレコードについては、新しいレコードをプレースホルダーとして INSERT したいと思います。つまり、下の #1

現在のテーブル

+-------+-----------+-------------------+-------------------+------------+------------+
|PART   |PART NAME  |Default Supplier   |Possible Suppliers |Quote       |InfoComplete|
+-------+-----------+-------------------+-------------------+------------+------------+
|#1     |Part 1     |Supplier 5         |Supplier 1         |25.0        |0           |
|#1     |Part 1     |Supplier 5         |Supplier 2         |20.5        |0           |
|#2     |Part 2     |Supplier 10        |Supplier 10        |10.4        |1           |
|#3     |Part 3     |NULL               |Supplier 3         |9.5         |0           |
|#3     |Part 3     |NULL               |Supplier 4         |11.5        |0           |
+-------+-----------+-------------------+-------------------+------------+------------+

必要な出力 (わかりやすくするために空白を表示)

+-------+-----------+-------------------+-------------------+------------+------------+
|PART   |PART NAME  |Default Supplier   |Possible Suppliers |Quote       |InfoComplete|
+-------+-----------+-------------------+-------------------+------------+------------+
|#1     |Part 1     |Supplier 5         |Supplier 1         |25.0        |0           |
|#1     |Part 1     |Supplier 5         |Supplier 2         |20.5        |0           |
|#2     |Part 2     |Supplier 10        |Supplier 10        |10.4        |1           |
|#3     |Part 3     |NULL               |Supplier 3         |9.5         |0           |
|#3     |Part 3     |NULL               |Supplier 4         |11.5        |0           |
|       |           |                   |                   |            |            |     
|#1     |Part 1     |Supplier 5         |**MISSING**        |NA          |0           |
|#3     |Part 3     |**MISSING**        |**MISSING**        |NA          |0           |
+-------+-----------+-------------------+-------------------+------------+------------+

私が読んだことから、マージステートメントは解決策かもしれませんが、まったく機能しませんでした。

編集:

申し訳ありませんが、最初の投稿でもう少し明確にする必要がありました。情報は、ユーザーが不足しているデータを確認できるようにエクスポートされています。データベースの NULL 値を置き換える予定はありません。

ユーザーがデータをより明確に理解できるように、データを操作したかっただけです。

フィードバックに基づいて、ユーザーに情報を表示するためのより良い方法を検討しています。

4

4 に答える 4

1

Null を魔法の文字列に置き換えたいというあなたの理由を聞くのを待つことにしました。クエリを単純にして**MISSING**、デフォルトのサプライヤーが NULL の場合は常にフレーズを出力したいので、これをやりたいと思うだけです。サプライヤーへの外部キーを (1 つでもあると仮定して) null を決して含まない null 許容の varchar フィールドに変換するよりも、繰り返しのない方法でそのタスクを達成するためのより良い方法があります。

次のような場合は、ビューを使用してこのデータにアクセスすることをお勧めします。

IF ( OBJECT_ID('dbo.vw_PartsSuppliers') IS NOT NULL ) 
   DROP VIEW dbo.vw_PartsSuppliers
GO

CREATE VIEW dbo.vw_PartsSuppliers
AS
  SELECT 
         p.PartId,
         p.PartName,
         ISNULL(s.SupplierName, '**MISSING**'),
         ISNULL(s.Quote, 'NA'),
         s.InfoComplete
  FROM
         dbo.Part p
         LEFT JOIN dbo.Supplier s ON p.DefaultSupplierId = s.SupplierId            
GO  

このアプローチは柔軟で再利用可能であり、目的のフォーマットを提供します。さらに、デフォルトのサプライヤーのない部品を特定する必要があるクエリが発生すると (おそらくそうなるでしょう)、**MISSING**マジック ストリングではなく NULL を検索しているため、パフォーマンスが低下することはありません。

于 2013-04-03T06:30:17.277 に答える
1

トリガーの使用を検討する

CREATE TRIGGER NULL_DEFAULTSUPP
AFTER INSERT ON TABLE-NAME
FOR EACH ROW BEGIN
WHERE NEW.Default Supplier IS NULL
BEGIN
INSERT INTO TABLE-NAME VALUES(NEW.PART, NEW.PART-NAME, "**MISSING**", ....);
END;
于 2013-04-03T06:13:25.797 に答える
0

以下は、MERGE を使用して目的の出力を実現する方法をやや単純化した例です。PartsSuppliersInfo上記の例のように、部品とサプライヤーに関するデータを含むテーブルは 1 つだけです。

SQLFiddle デモ

;WITH trgtCTE AS 
(
    SELECT Part, PartName, DefaultSupplier, PossibleSuppliers, Quote, InfoComplete FROM PartsSuppliersInfo
    WHERE DefaultSupplier = '**MISSING**' OR [PossibleSuppliers] = '**MISSING**'
)
MERGE trgtCTE AS trgt
USING
(
    SELECT DISTINCT Part, PartName, '**MISSING**' AS DefaultSupplier,'**MISSING**' AS PossibleSuppliers, NULL AS Quote, 0 AS InfoComplete  FROM PartsSuppliersInfo
    WHERE DefaultSupplier IS NULL
    UNION 
    SELECT DISTINCT p.Part, PartName, DefaultSupplier,'**MISSING**' AS PossibleSuppliers, NULL AS Quote, 0 AS InfoComplete FROM PartsSuppliersInfo p
    WHERE DefaultSupplier IS NOT NULL AND InfoComplete = 0  
) src
ON src.part = trgt.part AND src.DefaultSupplier = trgt.DefaultSupplier AND src.PossibleSuppliers = trgt.PossibleSuppliers
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Part, PartName, DefaultSupplier, PossibleSuppliers, Quote, InfoComplete)
    VALUES (Part, PartName, DefaultSupplier, PossibleSuppliers, Quote, InfoComplete)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;

のターゲット部分は、キーワードMERGEを持つ行のみを持つ CTEです。**MISSING**最初は空ですが、次回ステートメントが実行されるたびに、前回の実行の結果が含まれます。

ソース部分は、どの**MISSING**行が存在する必要があるかを計算するロジックを含むサブクエリです。

最後の 2 つの部分は、不要になった行を削除し (部分が欠落していない場合)、新しい行を挿入します。

于 2013-04-03T13:34:38.690 に答える