1

修正中の非常に大きな、正規化されていないテーブルが1つあります。その大きなテーブルから、データを正規化しています。SQLステートメントを使用しました

INSERT INTO smallTable(patientID, admissionDate, dischargeDate)
select distinct patientID, admissionDate, dischargeDate
FROM largeTable

したがって、私のsmallTableには正しい行数が入力されます。drgCodesmallTableに追加したい別の列があります。私はそれをするために次のクエリを試しました

INSERT INTO smallTable(drgCode)
select drgCode from
(
SELECT DISTINCT patientID, admissionDate, dischargeDate, drgCode from largeTable) as t

私が与えられたエラーは読み取りますcannot insert the value NULL into patientID, column does not alloq nulls, insert fails

drgCodeが正しく選択される唯一の方法は、select distinctクエリのバリアントが使用されている場合です。検索を絞り込むために他のフィールドを含める必要がある場合、1つのフィールドのみを挿入するにはどうすればよいですか。

smallTableを空にすればこれができることはわかっていますが、それを回避する方法が必要だと思いました。

4

3 に答える 3

5
    with    drg as (SELECT DISTINCT patientID, admissionDate, dischargeDate, drgCode from largeTable)
    update  s
    set     s.drgCode = l.drgCode
    from    smallTable s join drg l on 
                s.patientId = l.patientId and
                s.admissionDate = l.admissionDate and
                s.dischargeDate  = l.dischargeDate
于 2012-06-11T15:48:11.727 に答える
2

私の理解によると、両方のテーブルで一意の「PatientID」がある場合は、次のようにすることができます。

Update S
SET S.drgCode = L.drgCode
FROM
    SmallTable S
INNER JOIN
    LargeTable T
   ON S.PatientID = T.PatientID

お役に立てれば!!

于 2012-06-11T15:37:56.960 に答える
1

テーブルへの挿入を実行すると、クエリで指定されていない値には、列のデフォルト値が入力されます。列にデフォルト値がない場合は、NULLが使用されます。列でNULLが許可されておらず、デフォルトがないため、この特定のエラーメッセージが表示されました。

Praveenへの返信を考えると、おそらくさらに正規化して、drgCodesを別のテーブルに配置する必要があります。

于 2012-06-11T15:50:02.000 に答える