2011-08-12 18 views
0

次のクエリは20行を生成します。私は「種類とバージョン」の複製バージョンを排除しようとしているが、私はとにかくクエリの結果で重複を排除する問題

SELECT DISTINCT 
STR(C.CustomerID, 4) AS 'Customer ID', 
STR(INV.InvoiceNbr, 3) AS 'Invoice Number', 
STR(LINE.FK_StoveNbr, 3) AS 'Stove Number', 
CAST(S.Type + ', ' + S.Version AS CHAR (15)) AS 'Type and Version' 
FROM CUSTOMER C, INVOICE INV, INV_LINE_ITEM LINE, STOVE S 
WHERE INV.FK_CustomerID = C.CustomerID 
AND INV.InvoiceNbr = LINE.FK_InvoiceNbr 
AND SerialNumber = LINE.FK_StoveNbr 
AND C.StateProvince = 'OR' 
ORDER BY 'Type and Version'; 

を複製返す保つ、私は私の結果でストーブの種類とバージョンの複数のバージョンを取得しておきます。オレゴンには10人の顧客しかいないので、これが正しいとは思えません。

答えて

0

あなたが直線結合を使用している場合は、左に切り替えてみてください。

SELECT DISTINCT 
    STR(C.CustomerID, 4) AS 'Customer ID', 
    STR(INV.InvoiceNbr, 3) AS 'Invoice Number', 
    STR(LINE.FK_StoveNbr, 3) AS 'Stove Number', 
    CAST(S.Type + ', ' + S.Version AS CHAR (15)) AS 'Type and Version' 
FROM INVOICE INV, 
    LEFT JOIN CUSTOMER C on (C.CustomerID = INV.FK_CustomerID) 
    LEFT JOIN INV_LINE_ITEM LINE ON (INV.InvoiceNbr = LINE.FK_InvoiceNbr) 
    LEFT JOIN STOVE S ON (S.SerialNumber = LINE.FK_StoveNbr) 
WHERE C.StateProvince = 'OR' 
ORDER BY 'Type and Version'; 

理由は、すべてのテーブルをマスターとして扱うストレートジョインです。 1 = 1、左結合により優先度を設定できます。だから私の例では。 INVOICEはメインテーブルです。他のすべてのテーブルは、追加情報を入力するためだけに使用されます。彼らは添付されています。

希望は意味があります。

+0

また、あなたのテーブルの名前は少しファンキーです。通常はすべて小文字にします。異なるdbサーバは大文字と小文字の区別を異なる方法で扱います。そして、「顧客ID」としてスペースを捨てます。私はこれらの行をhtmlに直接出力していると推測しています。しかし、あなたは本当にhtml(または他のディスプレイ)に '顧客ID'の部分を保持し、プログラミング側で 'customer_id'を保持する必要があります。 –

+0

ありがとうございます。私はそれが事実かどうか疑問に思っていた。 YouTubeで、私が使ってきた本よりLEFT JOINとINNER JOINを説明するのに良い仕事をしたビデオがいくつか見つかりました。しかし、私は重複を生産しているかどうかまだ不明です。 – krebshack

関連する問題