2017-08-07 2 views
2

SQL Serverを使用して、Where句で2つのSelectステートメントがありますが、重複した結果が得られます。私の最初のクエリは:SQLマージ重複を削除する際に異なる列番号のクエリを選択しますか?

SELECT 
    PricingContingencies.*, 
    Terms.*, 
    rscDescription AS RateScheme, 
    ptyAbbreviation AS PointTypeAbbreviation, 
    FAKs.*, 
    fat.* 
    FROM ((((PricingContingencies 
    INNER JOIN Terms ON pcoTerms = terID) 
    INNER JOIN PointTypes ON pcoPointTypeFK = ptyID) 
    LEFT JOIN RateSchemes ON pcoRateSchemeFK = rscID) 
    LEFT JOIN FAKs ON fakPricingContingencyFK = pcoID) 
    LEFT JOIN FuelAgreementTypes fat ON ftyID = pcoFuelAgreementTypeFK 
    WHERE pcoPricingAgreementFK = 61523 and pcoID = 16490608 

そして、2行(正しい)です。

私の2番目のクエリは非常に似ていますが、追加の列があります(唯一の違いはある 'LEFT ON PalletPricing登録しようpprPricingContingenciesFK = pcoID)' 'LEFT fakPricingContingencyFK = pcoID ON FAKS)、JOIN' の代わりに:

SELECT 
    PricingContingencies.*, 
    Terms.*, 
    rscDescription as RateScheme, 
    ptyAbbreviation as PointTypeAbbreviation, 
    PalletPricing.*, 
    fat.* 
FROM ((((PricingContingencies 
    INNER JOIN Terms ON pcoTerms = terID) 
    INNER JOIN PointTypes ON pcoPointTypeFK = ptyID) 
    LEFT JOIN RateSchemes ON pcoRateSchemeFK = rscID) 
    LEFT JOIN PalletPricing ON pprPricingContingenciesFK = pcoID) 
    LEFT JOIN FuelAgreementTypes fat ON ftyID = pcoFuelAgreementTypeFK 
WHERE pcoPricingAgreementFK = 61523 and pcoID = 16490608 

とを6行(これも正しい)を返します。

合計で8行になるように組み合わせるにはどうすればよいですか?私は使用してそれらを組み合わせる場合のように内部結合:私はPalletPricing列が重複し、誤っれる12行を取得

SELECT 
    FirstSet.*, 
    SecondSet.* 
FROM (
    SELECT 
    PricingContingencies.*, 
    Terms.*, 
    rscDescription AS RateScheme, 
    ptyAbbreviation AS PointTypeAbbreviation, 
    FAKs.*, 
    fat.* 
    FROM ((((PricingContingencies 
    INNER JOIN Terms ON pcoTerms = terID) 
    INNER JOIN PointTypes ON pcoPointTypeFK = ptyID) 
    LEFT JOIN RateSchemes ON pcoRateSchemeFK = rscID) 
    LEFT JOIN FAKs ON fakPricingContingencyFK = pcoID) 
    LEFT JOIN FuelAgreementTypes fat ON ftyID = pcoFuelAgreementTypeFK 
    WHERE pcoPricingAgreementFK = 61523 and pcoID = 16490608 
) as FirstSet 
INNER JOIN 
    (
    SELECT 
     PricingContingencies.*, 
     Terms.*, 
     rscDescription as RateScheme, 
     ptyAbbreviation as PointTypeAbbreviation, 
     PalletPricing.*, 
     fat.* 
    FROM ((((PricingContingencies 
     INNER JOIN Terms ON pcoTerms = terID) 
     INNER JOIN PointTypes ON pcoPointTypeFK = ptyID) 
     LEFT JOIN RateSchemes ON pcoRateSchemeFK = rscID) 
     LEFT JOIN PalletPricing ON pprPricingContingenciesFK = pcoID) 
     LEFT JOIN FuelAgreementTypes fat ON ftyID = pcoFuelAgreementTypeFK 
    WHERE pcoPricingAgreementFK = 61523 and pcoID = 16490608 
    ) as SecondSet 
ON FirstSet.pcoID = SecondSet.pcoID 
ORDER BY FirstSet.pcoPriority DESC 

(第2の結果を倍増[6×2])。どうすれば正しい8行(2 + 6)が得られるのですか?

ありがとうございます。

+1

基本的にUNIONクエリを探しています。ただし、UNION(またはそのより包括的な兄弟UNION ALL)では、2つの問合せでは、各列にほぼ同じデータ型の列が同じになる必要があります。 PalletPricingとFaksが同じテーブルレイアウトを持っていない限り、偽のデータを返す必要があります。また、2つのソースのそれぞれからのカラム名は、トップクエリから出力するカラム名に設定されます。 –

+0

本当に重複していますか?おそらく、少なくとも1つの列が異なります。 – Parfait

+0

正しいですが、1つの列が異なります。その1つの異なる列を除外して、行全体がクエリに含まれないようにするにはどうすればよいですか? – smac

答えて

0

ご希望の場合INNER JOINは動作しません。現在のコードのような結合を使用すると、各クエリのすべての列を非常に広い行にまとめることになります。 UNIONが必要です(UNION ALLではなく、具体的にではありません。ダブを確認してください)。

コメントには、各クエリに同じ数のフィールドが必要であり、同等のデータが含まれている必要があります。そうでなければ、フィールドにはどのクエリが来たかによって2種類のデータがあります。

UNIONを使用する場合は、明示的にフィールドを指定することをお勧めします。.*は、問題のテーブル内ですべての列が同じ順序であることを賭けているので危険な方法です。だから、あなたができる:明らかに一致して、あなたのフィールドの2のための単なる一例である

SELECT 
    rscDescription AS RateScheme, 
    ptyAbbreviation AS PointTypeAbbreviation, 
    FROM ((((PricingContingencies 
    INNER JOIN Terms ON pcoTerms = terID) 
    INNER JOIN PointTypes ON pcoPointTypeFK = ptyID) 
    LEFT JOIN RateSchemes ON pcoRateSchemeFK = rscID) 
    LEFT JOIN FAKs ON fakPricingContingencyFK = pcoID) 
    LEFT JOIN FuelAgreementTypes fat ON ftyID = pcoFuelAgreementTypeFK 
    WHERE pcoPricingAgreementFK = 61523 and pcoID = 16490608 
UNION 
SELECT 
     rscDescription as RateScheme, 
     ptyAbbreviation as PointTypeAbbreviation, 
    FROM ((((PricingContingencies 
     INNER JOIN Terms ON pcoTerms = terID) 
     INNER JOIN PointTypes ON pcoPointTypeFK = ptyID) 
     LEFT JOIN RateSchemes ON pcoRateSchemeFK = rscID) 
     LEFT JOIN PalletPricing ON pprPricingContingenciesFK = pcoID) 
     LEFT JOIN FuelAgreementTypes fat ON ftyID = pcoFuelAgreementTypeFK 
    WHERE pcoPricingAgreementFK = 61523 and pcoID = 16490608 

を、あなたは、列ごとに行かなければなりません。

+0

残念ながら、列は一致しません。 FAKテーブルには6つの列があり、PalletPricingテーブルには9つの列があります。私はUNIONを最初のクエリの余分な3つの列に入れようとしましたが、最初のクエリにはこれらの列ヘッダーがあるため、結果にFAKテーブルの列にパレット価格のデータが不完全に含まれていました。 – smac

0

内部結合の代わりに "union all"を入れる必要があります。

SELECT 
    PricingContingencies.*, 
    Terms.*, 
    rscDescription AS RateScheme, 
    ptyAbbreviation AS PointTypeAbbreviation, 
    FAKs.*, 
    fat.* 
    FROM ((((PricingContingencies 
    INNER JOIN Terms ON pcoTerms = terID) 
    INNER JOIN PointTypes ON pcoPointTypeFK = ptyID) 
    LEFT JOIN RateSchemes ON pcoRateSchemeFK = rscID) 
    LEFT JOIN FAKs ON fakPricingContingencyFK = pcoID) 
    LEFT JOIN FuelAgreementTypes fat ON ftyID = pcoFuelAgreementTypeFK 
    WHERE pcoPricingAgreementFK = 61523 and pcoID = 16490608 
union all 
    SELECT 
     PricingContingencies.*, 
     Terms.*, 
     rscDescription as RateScheme, 
     ptyAbbreviation as PointTypeAbbreviation, 
     PalletPricing.*, 
     fat.* 
    FROM ((((PricingContingencies 
     INNER JOIN Terms ON pcoTerms = terID) 
     INNER JOIN PointTypes ON pcoPointTypeFK = ptyID) 
     LEFT JOIN RateSchemes ON pcoRateSchemeFK = rscID) 
     LEFT JOIN PalletPricing ON pprPricingContingenciesFK = pcoID) 
     LEFT JOIN FuelAgreementTypes fat ON ftyID = pcoFuelAgreementTypeFK 
    WHERE pcoPricingAgreementFK = 61523 and pcoID = 16490608 
関連する問題