加入问题后的Sql不同的选择性行

Alv*_*par 3 sql join distinct

假设我有 2 张表 Customer 和 Books。

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

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

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

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

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

jel*_*key 5

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

SELECT DISTINCT Customers.member_id, Books.book_title
FROM Customers
INNER JOIN Books ON Customers.member_id = Books.member_id
Run Code Online (Sandbox Code Playgroud)

如果这不能正常工作,您可以使用内部选择:

SELECT DISTINCT *
FROM (SELECT Customers.member_id, Books.book_title
      FROM Customers
      INNER JOIN Books ON Customers.member_id = Books.member_id) As newTable
Run Code Online (Sandbox Code Playgroud)

另外,如果这是一个经常使用的查询,我会避免使用 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
Run Code Online (Sandbox Code Playgroud)

这应该返回与客户关联的所有书籍(但每个标题只有一次,如果没有找到书籍,则它将返回一个空字符串。)如果这不能回答问题,请提供有关表格的一些附加信息和示例你想要的结果,我会更新。

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

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

这是基于您提供的数据和示例输出的另一个查询。

SELECT Member_Name, Email
FROM thridTable
WHERE Member_Name = @SomeInputParameter
Run Code Online (Sandbox Code Playgroud)

我不确定您的示例数据的代表性如何,但为什么要将成员名称存储在多个表中?这在未来肯定会让人头疼。