连接问题后sql不同的选择行

时间:2009-08-18 00:06:47

标签: sql join distinct

假设我有2个表Customer和Books。

Table Books可以有多行与Customer中的行相关。

例: 客户John Doe的id为1000。 Table Books有2行,其member_id列为1000(John Doe)。

这两行是相同的,除了其中一个字段(书名)是空的。另一行有一个标题值。

问题: 我如何查询这个,以便我检索具有有效标题值的行,但是,如果两个标题值都为空,那么它只返回一行?

我当然希望这是有道理的。

3 个答案:

答案 0 :(得分:3)

您应该能够使用不同的运算符:

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,因为它们会出现性能问题。

回复编辑:

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

这应该返回与客户相关的所有书籍(但每个标题只有一次,如果没有找到书籍,那么它将返回一个空字符串。)如果这不回答问题,请包含一些关于表格的其他信息以及您想要的结果示例,我将更新。

好的,现在我想我知道你在找什么:

以下是使用提供的表格基于原始问题的可能查询。但是,如果客户设置了两个不同的电子邮件地址,它将无法工作;在这种情况下,您可以添加TOP(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

我不确定您的样本数据有多具代表性,但为什么要将成员名称存储在多个表中?这是未来的头疼。

答案 1 :(得分:0)

如果我理解您的意思,此查询将返回所有具有非空书名的记录以及所有没有有效书记录的客户记录,有效被定义为具有非空标题的书记录。

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)

答案 2 :(得分:0)

您可以使用:

isnull(BOOKTITLE,'') = '' 

在该字段和一个不同的,它应该给出一个结果

相关问题