2012-02-20 19 views
0

私はこのクエリを使用していますが、私はそれが間違ってい...SQL SELECT重複する列

SELECT * FROM [Orders] 
JOIN [Customers] 
ON [Orders].[CustomerID] = [Customers].[CustomerID] 
WHERE [Orders].[OrderDate] BETWEEN '2010/1/1' AND '2011/1/1' 
AND [Orders].[Total] > 1 

私は得意先のために重複する列名エラーを取得しています。私は、これを動作させるためにエイリアスを使用する方法がわかりません。

誰かに正しく書き込む方法を教えてもらえますか?

EDIT:すべての提案のための

おかげで、ここで私はと一緒にすることができます。

SELECT DISTINCT Orders.CustomerID, Orders.ShipToID, Orders.ShipName, Orders.ShipAddress, Orders.ShipAddress2, Orders.ShipCity, Orders.ShipStateOrProvince, Orders.ShipPostalCode, Orders.Total, Orders.OrderDate, Customers.Profession 
FROM Orders 
JOIN Customers 
ON Orders.CustomerID = Customers.CustomerID 
WHERE Orders.OrderDate BETWEEN '4/3/2010' AND '2/20/2011' 
AND Orders.Total > 1 

ありがとうございます!

+3

生産コードでは「SELECT *」を使用しないでください。列に名前を付けます。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/bad-habits-to-kick-using-select-omitting-the-column-list.aspxを参照してください。 –

+0

@AaronBertrand大きなアドバイス非常に良い記事です)。これは生産コードだという兆候はありません。 – jadarnel27

+0

@ jadarnel27確かに 'SELECT * 'を使用していないことはまだ問題を緩和するのに役立ちます - 少なくともあなたはエイリアスを制御できます。 –

答えて

3

SELECT *ではなく、選択している列を明示し、両方の表から同様の名前の列を取得する必要がある場合は、別名を使用します。

SELECT 
    Orders.OrderID, 
    /* alias example, not that you'd need both CustomerID columns */ 
    Orders.CustomerID AS oCustomerID, 
    Customer.CustomerID AS cCustomerID, 
    Customers.Name, 
    Customers.Address, 
    .... 
    .... 
FROM [Orders] 
JOIN [Customers] 
ON [Orders].[CustomerID] = [Customers].[CustomerID] 
WHERE [Orders].[OrderDate] BETWEEN '2010/1/1' AND '2011/1/1' 
AND [Orders].[Total] > 1 
2

*を使用するのではなく、明快にしたいすべての列を参照する必要があります。

SELECT [Orders].* FROM [Orders] 

あなたは、両方のテーブルからすべての列を希望した場合は、あなたがリストする必要があります:あなたはそのエラーを回避するために、最初にテーブルを指定する必要が

例えば

SELECT 
    C.ID, 
    O.ID 
FROM 
    [Orders] O 
    JOIN [Customers] C 
    ON O.[CustomerID] = C.[CustomerID] 
WHERE 
    O.[OrderDate] BETWEEN '2010/1/1' AND '2011/1/1' 
    AND O.[Total] > 1 
+1

あなたはまだそれらの列にエイリアスを付けたいと思うでしょう。重複する列を検出しているものは、どの表がどの表から来たものかを気にすることはありませんが、結果セットにはIDという名前の2つの列が表示されます。 –

3

それらはすべて別々にまとめられ、重複列CustomerIDのエイリアスになります。唯一のOrdersテーブルから列を取得するには

SELECT 
    [Orders].CustomerID AS oCustID, 
    [Customers].CustomerID AS cCustID, 
    [Orders].anotherColumn, 
    ... 
4
SELECT [Orders].* FROM [Orders] ... 

。または*をスキップして、必要な列を明示的に記述します。