2016-06-30 12 views
1

Ich habe eine Tabelle mit Übersetzungen (Beispiel vereinfacht):Eine knifflige Abfrage - eine Art von verschiedenen

Diejenigen GroupId = 0 mit global sind, diejenigen, die eine GroupId mit> 0 sind für diese Gruppe spezifisch.

ID(BitInt), TranslationId(BigInt), GroupId(BigInt), Translation(VarChar(100) 
1   1      0    'Hello' 
2   1      20    'Hi there' 
3   1      25    'Hi' 
4   2      0    'Goodbye' 
5   3      20    'See you' 
6   3      25    'See Ya' 
7   4      25    'Well well' 

Ich brauche für eine bestimmte Gruppe von diesem wählen mir geben:

Wenn ein Datensatz mit dem richtigen GroupId existiert dann, dass man sonst die global mit GroupId = 0

So kann sagen, ich mache eine Abfrage mit GroupId 20 = Es zurückkehren sollte

2,1,20,'Hi there' 
4,2,0,'Goodbye' 
5,3,20,'See you' 

Und eine Abfrage mit GroupId = 25

3,1,25,'Hi' 
4,2,0,'Goodbye' 
6,3,25,'See Ya' 
7,4,25,'Well well' 

Und eine Abfrage mit GroupId = 37

1,1,0,'Hello' 
4,2,0,'Goodbye' 

Hope this irgendeine Art von Sinn gibt, und Dank im Voraus :)

+0

Nur um sicherzugehen - GroupId 0 alle möglichen Datensätze enthält? –

+0

es ist nur eine grundlegende where-Klausel: GroupdID = @ testGroup ODER GroupID = 0 –

+0

Eigentlich ist es nach TranslationId gruppiert. Es kann TranslationId geben, die nicht mit GroupId 0 als 3 und 4 in dem Beispiel vorhanden sind. Einige sind nur mit einer einzigen GroupId als 4 im Beispiel vorhanden. Einige sind nur mit GroupId 0 – Beaker

Antwort

0

Hier ist ein Weg, um es (vorausgesetzt, die Kombination von zu tun TranslationId und GroupId ist einzigartig):

erstellen und Probentisch (Bitte speichern uns diesen Schritt in Ihren nächsten Fragen füllen)

DECLARE @T As TABLE 
(
    ID BigInt, 
    TranslationId BigInt, 
    GroupId BigInt, 
    Translation VarChar(100) 
) 

INSERT INTO @T VALUES 
(1, 1, 0, 'Hello'), 
(2, 1, 20, 'Hi there'), 
(3, 1, 25, 'Hi'), 
(4, 2, 0, 'Goodbye'), 
(5, 3, 20, 'See you'), 
(6, 3, 25, 'See Ya'), 
(7, 4, 25, 'Well well') 

Abfrage:

DECLARE @GroupId BigInt = 20 

SELECT ID, TranslationId, GroupId, Translation 
FROM @T 
WHERE GroupId = @GroupId 

UNION ALL 

SELECT T1.ID, T1.TranslationId, T1.GroupId, T1.Translation 
FROM @T T1 
LEFT JOIN @T T2 ON(T1.TranslationId = T2.TranslationId AND T2.GroupId = @GroupId) 
WHERE T1.GroupId = 0 
AND T2.Id IS NULL 

Ergebnisse:

@GroupId = 20

ID     TranslationId  GroupId    Translation 
-------------------- -------------------- -------------------- ----------- 
2     1     20     Hi there 
5     3     20     See you 
4     2     0     Goodbye 

@GroupId = 25

ID     TranslationId  GroupId    Translation 
-------------------- -------------------- -------------------- ----------- 
3     1     25     Hi 
6     3     25     See Ya 
7     4     25     Well well 
4     2     0     Goodbye 

@GroupId = 37 (existiert nicht in den Beispieldaten)

ID     TranslationId  GroupId    Translation 
-------------------- -------------------- -------------------- ----------- 
1     1     0     Hello 
4     2     0     Goodbye 
+0

Wow das scheint zu funktionieren ... Entschuldigung für die Population Sachen, ich frage nicht sehr oft SQL-Fragen so einfach versucht, in Pseudo-Code zu erklären, wo ich mit dem tatsächlichen Bevölkerung Code besser gewesen wäre :) – Beaker

+0

Nun, wenn eine Antwort Ihr Problem gelöst, dann sollten Sie Markieren Sie es als akzeptiert. Denken Sie auch daran, dass es besser ist, Fragen zu beantworten, bei denen Sie Ihre Antwort tatsächlich testen können, bevor Sie sie veröffentlichen. –

+0

Danke. Werde das bedenken :) – Beaker

Verwandte Themen