3

CustomerとBooksの2つのテーブルがあるとします。

テーブルブックには、Customerの行に関連する複数の行を含めることができます。

例:顧客のJohn DoeのIDは1000です。TableBooksには、1000のmember_id列を持つ2つの行があります(JohnDoe)。

これらの2つの行は、フィールドの1つ(本のタイトル)が空であることを除いて同一です。もう一方の行には、タイトルの値があります。

質問:有効なタイトル値を持つ行を取得するようにこれをクエリするにはどうすればよいですか?ただし、両方のタイトル値が空の場合は、単一の行が返されますか?

私は確かにそれが理にかなっていることを願っています。

4

3 に答える 3

5

個別の演算子を使用できるはずです。

SELECT DISTINCT Customers.member_id, Books.book_title
FROM Customers
INNER JOIN Books ON Customers.member_id = Books.member_id

それが正しく機能しない場合は、内部選択を使用できます。

SELECT DISTINCT *
FROM (SELECT Customers.member_id, Books.book_title
      FROM Customers
      INNER JOIN Books ON Customers.member_id = Books.member_id) As newTable

また、これが頻繁に使用されるクエリである場合、UNION にはパフォーマンスの問題があることが知られているため、UNION は避けます。

編集に応じて:

SELECT Customers.member_id, Customer_Info.Name, ISNULL(newTable.book_title, '')
FROM Customers
INNER JOIN Customer_Info
LEFT JOIN (SELECT DISTINCT member_id, book_title FROM Books) newTable
    ON newTable.member_ID = Customers.member_id

これにより、顧客に関連付けられたすべての本が返されます (ただし、タイトルごとに 1 回だけで、本が見つからない場合は空の文字列が返されます)。これで質問に答えられない場合は、テーブルに関する追加情報と例を含めてください。あなたが望む結果を更新します。

OK、これであなたが探しているものがわかったと思います:

提供された表を使用して、元の質問に基づいたクエリを次に示します。ただし、顧客が 2 つの異なる電子メール アドレスを設定している場合は機能しません。その場合、TOP(1) を追加して結果を 1 つだけにすることはできますが、それが「正しい結果」かどうかはわかりません。

SELECT Customers.member_id, Office.Office_Name, ISNULL(newTable.email, '')
FROM Customers
INNER JOIN Office
LEFT JOIN (SELECT DISTINCT member_id, email 
           FROM Books 
           WHERE email IS NOT NULL AND email <> '') newTable
    ON newTable.member_ID = Customers.member_id

提供したデータと出力例に基づく別のクエリを次に示します。

SELECT Member_Name, Email
FROM thridTable
WHERE Member_Name = @SomeInputParameter

サンプル データがどの程度代表的かはわかりませんが、メンバー名を複数のテーブルに保存するのはなぜですか? それは将来の頭痛の種です。

于 2009-08-18T00:16:14.747 に答える
0

あなたの言っていることが理解できれば、このクエリは、null 以外の書籍のタイトルを持つすべてのレコードと、null 以外のタイトルを持つ書籍のレコードとして定義されている有効な書籍のレコードを持たないすべての顧客レコードを返します。

SELECT c.id, c.name, b.title
FROM customer c
JOIN book b ON c.id = b.customer_id
WHERE b.title IS NOT NULL
UNION ALL
SELECT c.id, c.name, NULL
FROM customer c
WHERE NOT EXISTS (SELECT title FROM book b WHERE customer_id = c.id AND title IS NOT NULL)
于 2009-08-18T00:13:34.027 に答える
0

以下を使用できます。

isnull(BOOKTITLE,'') = '' 

そのフィールドと明確な、そしてそれは1つの結果を与えるはずです

于 2009-08-18T00:16:03.187 に答える