2010-03-08 49 views
3

如果我有以下的主從關係的第一個詳細記錄:查詢只對每個主記錄

 
owner_tbl  auto_tbl 
---------  -------- 
owner ---> owner 
       auto 
       year 

而且我有以下表中的數據:

 
owner_tbl  auto_tbl 
---------  -------- 
john   john, corvette, 1968 
       john, prius, 2008 
james   james, f-150, 2004 
       james, cadillac, 2002 
       james, accord, 2009 
jeff   jeff, tesla, 2010 
       jeff, hyundai, 1996 

現在,我想執行查詢,返回以下結果:

 
john, corvette, 1968 
jeff, hyundai, 1996 
james, cadillac, 2002 

查詢應該連接兩個表,並對所有rec進行排序在「年」字段中輸入「ords」,但只返回每個主記錄的第一個詳細記錄。我知道如何加入表格並對「年份」字段進行排序,但不清楚我是如何(或如果)只能檢索每個所有者的第一個加入記錄。

三個相關的問題:

  1. 我能使用LINQ到SQL這種查詢?
  2. 我可以使用T-SQL執行查詢嗎?
  3. 鑑於其可能的複雜性,最好爲查詢創建一個存儲過程嗎?
+0

是的,您可以執行查詢。你想讓別人爲你寫嗎? – Gabe 2010-03-08 07:13:06

+0

使用頂部命令..有點 選擇頂部1 – Malcolm 2010-03-08 07:18:51

回答

4

使用Sql Server的2005+你可以嘗試(完整的示例)

DECLARE @owner_tbl TABLE(
     [owner] VARCHAR(50) 
) 

DECLARE @auto_tbl TABLE(
     [owner] VARCHAR(50), 
     [auto] VARCHAR(50), 
     [year]VARCHAR(4) 
) 

INSERT INTO @owner_tbl SELECT 'john' 
INSERT INTO @owner_tbl SELECT 'james' 
INSERT INTO @owner_tbl SELECT 'jeff'   

INSERT INTO @auto_tbl SELECT 'john','corvette','1968' 
INSERT INTO @auto_tbl SELECT 'john','prius','2008' 
INSERT INTO @auto_tbl SELECT 'james','f-150','2004' 
INSERT INTO @auto_tbl SELECT 'james','cadillac','2002' 
INSERT INTO @auto_tbl SELECT 'james','accord','2009' 
INSERT INTO @auto_tbl SELECT 'jeff','tesla','2010' 
INSERT INTO @auto_tbl SELECT 'jeff','hyundai','1996' 

;WITH Autos AS(
     SELECT *, 
       ROW_NUMBER() OVER(PARTITION BY a.owner ORDER BY a.year) ROWID 
     FROM @auto_tbl a 
) 
SELECT * 
FROM Autos 
WHERE ROWID = 1 
ORDER BY owner 
0

是這樣的:

SELECT o.owner, a.auto, a.EarliestYear 
FROM owner_tbl o 
INNER JOIN (SELECT owner, auto, min(year) As EarliestYear FROM auto_tbl 
GROUP BY owner, auto) a ON o.owner = a.owner 
1

你可以使用交叉適用於:

SELECT Owner, X.Car,X.Year 
FROM Owener_tbl O 
CROSS APPLY(
SELECT TOP 1 * FROM Auto_tbl WHERE Owner=O.Owner ORDER BY Year ASC 
) X 
1

c#linq2sql:

var results = db.owner_tbls.Select(p=>p.auto_tbls.OrderBy(q=>q.year).First()); 
0

示例LINQ/LINQPad腳本...返回您希望的結果,而不需要對您可能會篩選/選擇的Autos上的每個字段進行大量嵌套查詢。

var Owners = new [] { new { Name = "John" }, new { Name = "James" }, new { Name = "Jeff" } }; 
var Autos = new [] { 
    new { Owner = "John", Auto = "Corvette", Year = 1968 }, 
    new { Owner = "John", Auto = "Prius", Year = 2008 }, 
    new { Owner = "James", Auto = "F-150", Year = 2004 }, 
    new { Owner = "James", Auto = "Cadillac", Year = 2002 }, 
    new { Owner = "James", Auto = "Accord", Year = 2009 }, 
    new { Owner = "Jeff", Auto = "Tesla", Year = 2010 }, 
    new { Owner = "Jeff", Auto = "Hyundai", Year = 1996 } 
}; 

var results = from o in Owners 
       join c in Autos.OrderBy(a => a.Year) 
          .GroupBy(g => g.Owner) 
          .Select(a => a.FirstOrDefault()) 
        on o.Name equals c.Owner 
       orderby o.Name descending 
       select new { o.Name, c.Auto, c.Year }; 

results.Dump();