2012-07-30 55 views
2

我正在使用SQL Azure与asp脚本,对于我的生活,没有运气试图让这个工作。我正在运行一个查询的表有很多列,但我想查询2列(名称和电子邮件)上的不同值,从那里我希望它返回整个行的值。基于不同的列值返回行数据

什么我的查询看起来像现在:

SELECT DISTINCT quote_contact, quote_con_email 
FROM quote_headers 
WHERE quote_contact LIKE '"&query&"%' 

但我需要它返回整行,所以我可以检索其他数据点。如果我一年前很聪明,我会为联系人创建一个单独的表格,但那是一年前的事。

而之前我实现LiveSearch功能。

+1

但是,如果你有两个具有相同的名称和电子邮件五行 - 你想显示其五行?你不能真正将五行的数据合并为一个......。 – 2012-07-30 19:12:49

回答

0

一种方法是使用CTE(公用表表达式)。有了这个CTE,您可以按照一些标准对数据进行分区 - 即您的quote_contactquote_con_email - 并且SQL Server编号对于每个分区都从1开始,按照其他条件排序,即可能为SomeDateTimeStamp

因此,尝试这样的事:

;WITH DistinctContacts AS 
(
    SELECT 
     quote_contact, quote_con_email, (other columns here), 
     RN = ROW_NUMBER() OVER(PARTITION BY quote_contact, quote_con_email ORDER BY SomeDateTimeStamp DESC) 
    FROM 
     dbo.quote_headers 
    WHERE 
     quote_contact LIKE '"&query&"%' 
) 
SELECT 
    quote_contact, quote_con_email, (other columns here) 
FROM 
    DistinctContacts 
WHERE 
    RowNum = 1 

在这里,我只选择每个“分区”的最后一项(即每对名/电子邮件) - 由时间排序降序方式邮票。

这是否接近你要找的?

+1

Marc,这种方法听起来就像我在找的东西。我将不得不立即尝试。 – hatrickwah 2012-07-30 19:54:45

+1

经过一番修改之后,我能够很好地工作。该查询将结果数量减少为过去头文件中大部分错误的遗漏类型,否则,效果很好。万分感谢。 – hatrickwah 2012-07-30 20:52:01

0

您需要提供更多详细信息。 这是我能想出没有他们:

WITH dist as (
SELECT DISTINCT quote_contact, quote_con_email, RANK() OVER(ORDER BY quote_contact, quote_con_email) rankID 
FROM quote_headers 
WHERE quote_contact LIKE '"&query&"%' 
), 
data as (
SELECT *, RANK() OVER(ORDER BY quote_contact, quote_con_email) rankID FROM quote_headers 
) 
SELECT * FROM dist d INNER JOIN data src ON d.rankID = src.rankID