2017-03-04 1 views
0

MS-Access 2016を使用しています。何年もの間データベースを手に入れましたが、厳密にはアマチュアです。私はおそらくいくつかの明白な答えが不足していますが、私のすべての "左の結合は1つの行だけを表示する"検索でそれを見つけることができませんでした。 Paradox(DOS)でこの問題が発生したことはありませんでした。ここで私が立ち往生している場所を示すサンプルデータがあります。この左の結合クエリは、左のテーブルのすべての行を返さないのはなぜですか?

Table 1 - Customers 

CustID* | Name 
1  | Jane Doe 
2  | Jill Doe 
3  | John Doe 

Table 2 - Orders 

OrderID* | CustID | Order 
1  | 1  | Orange 
2  | 1  | Banana 
3  | 2  | Orange 
4  | 2  | Apple 
5  | 2  | Banana 
6  | 3  | Apple 
7  | 3  | Strawberry 
8  | 3  | Banana 

私は、彼らが持っているか、イチゴを持っていなかったかどうかを示し、すべての顧客のリストが欲しいです。

Name  | Order 
Jane Doe | (null) 
Jill Doe | (null) 
John Doe | Strawberry 

私が使用しているクエリは次のとおりです:

それは返す何
SELECT Customers.Name, Orders.Order 
FROM Customers LEFT JOIN Orders ON Customers.CustID = Orders.CustID 
WHERE (((Orders.Order)="Strawberry")); 

:それは、結果がどのように見えるべきである ジョン・ドウ|ストロベリー

何か魂は私が逃しているものを教えてください?前もって感謝します!

答えて

0
SELECT Customers.Name, Orders.Order 
FROM Customers LEFT JOIN Orders ON Customers.CustID = Orders.CustID 
WHERE (((Orders.Order)="Strawberry")); 

は、イチゴを注文した顧客のみを返します。あなたは、イチゴを注文していない顧客も求めていることを明確にする必要があります。

問題は、すべてのentris in Customersテーブルに可能な参加パートナーがある(つまり、イチゴ以外の何か)、LEFT JOINにNULLとして表示されないためです。したがって、あなたはイチゴを注文しなかった顧客について再度照会する必要があります。

お客様がまだ何も注文していない場合は、OR o.Order IS NULLも必要です。

(SELECT c.Name, o.Order 
FROM Customers AS c LEFT jOIN Orders AS o ON c.CustID = o.CustID 
WHERE o.Order = 'Strawberry' OR o.Order IS NULL 
GROUP BY c.Name, o.Order) 

UNION 

SELECT c.Name, null 
FROM Customers AS c 
WHERE NOT EXISTS (
    SELECT Orders.CustID 
    FROM Orders 
    WHERE c.CustID = Orders.CustID AND Orders.Order = 'Strawberry' 
) 

ORDER BY c.Name, o.Order 

私は、Accessデータベースエンジンが標準のSQLロジックを使いこなすと思います。私はAccess SQLが特に面倒であることがよくありました。ここでは、この集合クエリを動作させるために、by byとordery byを使用しなければなりません。

+0

既に試しました。動作しません。 1つのレコードを返します:John Doe |イチゴ。 – jalong

+0

実際には、なぜ、左結合がその性質上、すべてを供給する必要がある場合、追加の選択基準を提供する必要があるのはなぜですか?左のテーブルのすべてのレコード?それはこれについてとても奇妙なことです。 – jalong

+0

私は自分の答えを編集しました – EliteRaceElephant

0

ここが私の意図です。私はあなたがイラストレーションのために列名を使用したと仮定します。そうでなければ[Order]という名前は予約語であり、テーブル/列名には使用しないでください。

SELECT a.Name, b.[Order] 
FROM Customers a 
LEFT JOIN (SELECT * FROM Orders Where [Order] = 'Strawberry') b 
on a.CustID = b.CustID 
関連する問題