1

テーブルPRODUCTSLISTINGSがあります。次のクエリを実行する場合:

SELECT DISTINCT *
FROM products
INNER JOIN listings
ON products.product_number=listings.product_number

これが「検索」機能です。

WHERE products.product_number !='' 
AND listings.monthly_price BETWEEN '0' AND '10'

これは、製品リストの 1 つの二重エントリを返します。DISTINCTが機能しないのはなぜですか?

編集

製品:

product_number, make, model model_number, colour, processor, battery_standby, battery_talk, camera, flash, screen_size, screen_res, memory

リスト:

listing_number, featured, date, member_id, network, length, product_number, monthly_price, minutes, texts, data, image1

listings基本的に、テーブルを介してテーブルにPRODUCT_NUMBER一致する結果行を作成したいと思いproductます。より正確には、電話リスト Web サイトの検索機能です。

より具体的に言うと、検索機能はproductsテーブルを使用して検索し、次にテーブルを使用しlistingsて電話リストに関する有用な情報を表示します。

答え

SELECT DISTINCT *
FROM listings
INNER JOIN products
ON products.product_number=listings.product_number

上記はうまくいきました。テーブルを交換するだけです。にさらにいくつかの行を挿入したところlistings、「問題」は消えました。解決しなくても、もう起こっていません...何が問題だったのかわかりません。

4

2 に答える 2

2

私はあなたがそれから何かがDISTINCTそのように機能しないことを期待していると信じています....

とのテーブルProductsID、のテーブルがあると仮定します(FKからListing_date`(ここで少し簡単にするために...)NameListingsIDProductIDProducts), and

Productsさらに、テーブルにエントリがあると仮定します。

ID     Name
 1     Foobar
 2     Bazfoo

テーブルListingsにエントリがあります

ID    ProductID   ListingDate
 1        1         2012-01-01
 2        1         2012-03-01
 3        2         2012-04-01

これらの2つのテーブルを結合し、DISTINCT

 SELECT DISTINCT ProdID = p.ID, p.Name, ListingID = l.ID, l.ListingDate
 FROM dbo.Products p
 INNER JOIN dbo.Listings l ON l.ProductID = p.ID

どのような結果を期待しますか?

結果は次のようになります。

ProdID  Name   ListingID  ListingDate
 1     Foobar     1         2012-01-01 
 1     Foobar     2         2012-03-01
 2     Bazfoo     3         2012-04-01

DISTINCTキーワードはすべての列に適用されます。結果セットのすべての列が同一である場合にのみ、行が除外されます。

あなたのコメントから、私はあなたが「重複した」製品を除外すべきであるID = 1と期待していると信じるように導かれました。Name = Foobarこれは当てはまりません-結果セットを参照してください-4つの列すべてを見ると、これらの2つの行は同一でProdID = 1はありません-したがって、両方が表示されます。

これが、DISTINCTキーワードが機能するように定義されている方法です。

ID = 1の重複製品を「除外」する場合、Listingsテーブルの2つのエントリのどちらが結果セットに表示されると予想しますか?

于 2012-08-26T19:51:48.837 に答える
1

2 つのリストが 1 つの製品に参加しているレコードがある場合、これはあなたが見ているものを生成します:

個別の選択は、内部結合の結果に対して行われます

共通の結合値を使用して、各テーブルから * を選択し、結果を確認します

HTH

イアン

于 2012-08-26T16:30:11.877 に答える