-1

次のような状況の SQL Server 2012 Express データベースがあります。、SalesPurchaseおよびMovementテーブルがあります。と の両方Salesを表PurchaseにまとめMovementます。

しかし、データがどこから来るのかを制御したいと思います。基本的:

MOVEMENT_ID     TABLE_ID     RECORD_ID     PROD     QTY
1               PURCHASE     1             PENCIL   10
2               PURCHASE     2             ERASER   5
3               SALES        1             PENCIL   1
4               PURCHASE     3             MARKER   10

Record_ID正規化の部分について心配する必要はありません。列で指定されたテーブルのレコードにリンクする列に外部キーを設定できるかどうかを知りたいだけですTable_ID。そう...

  • で、テーブルMovementID=1の最初のレコードが欲しいPurchase
  • で、テーブルMovementID=3の最初のレコードが欲しいSales

これはまったく可能ですか?はいの場合、どのように?

4

3 に答える 3

0

これを何のために行っているかにもよりますが、このような非正規化されたテーブルはそれほど悪くないかもしれません (つまり、クエリ/分析のためだけの場合)。ただし、維持するのが難しくなる可能性があります (たとえば、これらのテーブルの ID のデータ型が異なるとどうなるかなど)。ただし、実行する可能性のあるクエリの例

;WITH SalesMovement AS
(
    SELECT * FROM Movement
    WHERE TableName = 'Sales'
)
SELECT PROD, SUM(QTY) FROM SalesMovement
GROUP BY PROD

 

;WITH PurchaseMovement AS
(
    SELECT * FROM Movement
    WHERE TableName = 'Purchase'
)
SELECT * FROM Purchase p
INNER JOIN PurchaseMovement pm ON pm.Record_Id = p.Id

 

;WITH PurchaseMovement AS
(
    SELECT * FROM Movement
    WHERE TableName = 'Purchase'
)
, SalesMovement AS
(
    SELECT * FROM Movement
    WHERE TableName = 'Sales'
)
SELECT * FROM Purchase p, 
INNER JOIN Sales s ON s.SaleDate = p.PurchaseDate
INNER JOIN PurchaseMovement pm ON pm.Record_Id = p.Id
INNER JOIN SalesMovement sm ON sm.Record_Id = s.Id

元のデータに結合したいときはいつでも、フィルタリング、キャスト、そしてさらに下にある本当のピタになる可能性のあるものを持っている必要があります

考慮すべきもう1つのことSUM(Qty) = SUM(ProductsSold) + SUM(ProductsSales)は、テーブル内のデータのこの種の「誤用」に注意する必要があります。

于 2013-05-30T15:34:17.840 に答える