1

単純なクエリがありますが、除外する必要のある複数のレコードがあります。ワイルドカードで同様のステートメントを使用しています。これを行ってからそれぞれを書き出すより良い方法はありますか?参照するudf、テーブルを作成できますか?どのように?私ができる場合。ありがとう :)

SELECT a.SalesOrderNo ,
       a.ShipExpireDate ,
       a.CustomerNo ,
       b.ItemCode ,
       b.LineKey ,
       b.QuantityOrdered ,
       b.QuantityShipped ,
       b.ItemCodeDesc ,
       b.ExplodedKitItem
FROM dbo.SO_SalesOrderHeader a
LEFT JOIN dbo.SO_SalesOrderDetail b
ON a.SalesOrderNo = b.SalesOrderNo
WHERE b.ItemType = '1'
  AND b.ItemCodeDesc NOT LIKE '%Cert%'
  AND b.ItemCodeDesc NOT LIKE '%Fee%'
  AND b.ItemCodeDesc NOT LIKE '%Tag%'
  AND b.ItemCode NOT LIKE 'GF%'
  AND b.ItemCode NOT LIKE 'PXDIALPREP'
  AND b.ItemCode NOT LIKE '/C%'
  AND a.ShipExpireDate = CONVERT(DATE, GETDATE(), 101) 
4

2 に答える 2

1

ItemCodeDesc を別のテーブルに配置できる別の設計を次に示します (これは TVF の場合もあります)。ただし、パフォーマンスについてはコメントできません。

別の注意として、販売注文の詳細に外部結合しているため、このテーブルには NULL レコードが含まれる可能性があることに注意してください。b.ItemType = '1'同様に、ItemType が NULL の場合は常に FALSE になります。したがって、それを内部結合にすることもできます(とにかく、クエリプランがそれを行っていることに気付くかもしれません)

   SELECT a.SalesOrderNo ,
   a.ShipExpireDate ,
   a.CustomerNo ,
   b.ItemCode ,
   b.LineKey ,
   b.QuantityOrdered ,
   b.QuantityShipped ,
   b.ItemCodeDesc ,
   b.ExplodedKitItem
   FROM dbo.SO_SalesOrderHeader a
   LEFT JOIN dbo.SO_SalesOrderDetail b
   ON a.SalesOrderNo = b.SalesOrderNo
   WHERE b.ItemType = '1'
   AND b.ItemCode NOT LIKE 'GF%'
   AND b.ItemCode NOT LIKE 'PXDIALPREP'
   AND b.ItemCode NOT LIKE '/C%'
   AND a.ShipExpireDate = CONVERT(DATE, GETDATE(), 101) 
   AND NOT EXISTS (
        SELECT 1 FROM dbo.MappingTable MT 
        WHERE b.ItemCodeDesc LIKE MT.ItemCodeDesc
        )
于 2013-02-28T22:58:59.103 に答える
0

注:あなたの基準は、出荷できないアイテムタイプ(手数料など)を除外するためのものであり、要件に応じて調整することを意図していると推測しています.

発生している問題は、ID に個別の値が格納されていることが原因です。IsShippable 列が必要なようです。または、Cert、Fee、Tag などの行を含む ItemCodeType のコード テーブルと IsShippable 列が必要です。あなたがコード表を持っていれば、あなたはできるでしょう

inner join ItemCodeTypes ict on ict.ItemCodeTypeId = b.ItemCodeTypeId and ict.IsShippable = 1

Cert、Fee、Tag、ItemCodeTypes テーブルの行は、IsShippable = 0 になります。

Id | Name |  IsShippable
1    Cert    0
2    Fee     0
3    Tag     0
4    Product 1
5    Book    1

編集:質問に直接答えるには、次のようなビューを作成し、そこからクエリを実行すると、Where IsShippable = 1 で簡単にフィルター処理できます。

Select CASE 
  When b.ItemCodeDesc LIKE '%Cert%' Then 0
  When b.ItemCodeDesc LIKE '%Fee%' Then 0 
--etc.
  Else 1
END as IsShippable
,* 
From dbo.SO_SalesOrderDetail
于 2013-02-28T22:49:04.787 に答える