2015-02-04 16 views
6

Nie jestem pewien, jak wyrazić to w SQL, jeśli jest to nawet możliwe, lub nawet to nazwać.Pierwszy najlepszy mecz, który nie był już używany

Chcę, dla każdego rekordu w Tabeli A, pierwszy najlepiej pasujący rekord w Tabeli B, który nie został jeszcze wybrany jako najlepiej pasujący. Na przykład załóżmy, że mam listę handlowa zlokalizowana oraz menu jedzenie:

Table A      Table B 
Generic Shopping List  Food Menu 
---------------------  ---------------------- 
Food Type     Food  Food Type 
---------------------  ---------------------- 
Meat       Tomatoes Vegetable 
Meat       Lettuce  Vegetable 
Vegetable     Bacon  Vegetable 
Vegetable     Bacon  Meat 
Vegetable     Beef  Meat 
Vegetable     Apple  Fruit 
Fruit      Orange  Fruit 
Fruit      Bacon  Fruit 
Dairy      Milk  Dairy 
          Cheese  Dairy 
          Yogurt  Dairy 

z kwerendy lub dołączyć, to łatwo uzyskać Top 1 mecz:

Table/Query C 
Automagic Shopping 
------------------ 
Food 
------------------ 
Bacon 
Bacon 
Tomatoes 
Tomatoes 
Tomatoes 
Tomatoes 
Apple 
Apple 
Milk 

wiem, jak to zrobić , a ponieważ lubię bekon, mógłbym z tym żyć. Niestety, naprawdę potrzebuję pełnej palety dostępnych opcji żywnościowych, tak, że mam do tego dostępne miejsca.

Table/Query C 
Better Magic Shopping 
--------------------- 
Food 
--------------------- 
Bacon 
Beef 
Tomatoes 
Lettuce 
Bacon 
<NULL - No More Available Matches - Don't Care> 
Apple 
Orange 
Milk 

Jeśli to można zrobić w programie Access, świetnie. Jeśli nie można tego zrobić w programie Access, ale można to zrobić w innym produkcie, nie jest idealny, ale działa.

Dzięki.

Odpowiedz

3

Jest to sposób, aby to zrobić w SQL Server:

SELECT t1.FoodType, t2.Food 
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY FoodType ORDER BY FoodType) AS rn 
    FROM #tableA) AS t1 
LEFT JOIN (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY FoodType ORDER BY FoodType) AS rn 
    FROM #tableB) AS t2 ON t1.FoodType = t2.FoodType AND t1.rn = t2.rn 

Poniżej znajdują się obok siebie, wyrażenia tabeli obliczone przez dwa podzapytania, t1, t2:

Results for t1:  Results for t2: 
FoodType rn  Food  FoodType rn 
---------------  -------------------------- 
Dairy  1   Milk  Dairy  1 
Fruit  1   Cheese Dairy  2 
Fruit  2   Yogurt Dairy  3 
Meat  1   Apple  Fruit  1 
Meat  2   Orange Fruit  2 
Vegetable 1   Bacon  Fruit  3 
Vegetable 2   Bacon  Meat  1 
Vegetable 3   Beef  Meat  2 
Vegetable 4   Tomatoes Vegetable 1 
         Lettuce Vegetable 2 
         Bacon  Vegetable 3 

Doing a LEFT JOIN na FoodType i rn zapewni ci to, co chcesz.

+0

Niesamowite, i dzięki! Dla własnego rozwoju, jak nazywa się ten rodzaj problemu? – Dave

+0

@Dave Obawiam się, że nie mogę ci pomóc w tym pytaniu. 'ROW_NUMBER' jest zwykle funkcją, która przydaje się w takich przypadkach, gdy wymagany jest pewien rodzaj połączenia ad hoc między dwoma zestawami. –

0

Dostęp umożliwia stosowanie klauzuli NOT IN. Po prostu napisz zapytanie, aby uzyskać TOP 1 mecz. Następnie włącz to zapytanie jako podzapytanie do klauzuli NOT IN.

Uwaga: możesz chcieć zastosować odpowiednią klauzulę Porządek, aby opisać, w jaki sposób określasz, co jest najlepsze, a co nie.

Powiązane problemy