2017-05-22 2 views
1

Ich bin ein seriöser SQL-Noob, so dass jede Hilfe geschätzt wird. Ich bin auch eine harte Zeit, zu erklären, was ich versuche ich das Layout zu tun, so würde, was ich habe, so weit:SQL aus der Spalte auswählen, in der die Spalte der Tabellenvariablen entspricht?

DECLARE @UserIDInt table (ID int); 

INSERT into @UserIDInt 
    SELECT UserId 
    FROM [LcsCDR].[dbo].[Users] 
    WHERE [LcsCDR].[dbo].[Users].[UserUri] LIKE '%example'; 

SELECT * 
FROM [LcsCDR].[dbo].[SessionDetails] 
WHERE [LcsCDR].[dbo].[SessionDetails].[User1Id] = @UserIDInt; 


"DECLARE @UserIDInt table (ID int);" 

Dies schafft meinen Variable mit einer Spalte namens „ID“

INSERT into @UserIDInt 
    SELECT UserId 
    FROM [LcsCDR].[dbo].[Users] 
    WHERE [LcsCDR].[dbo].[Users].[UserUri] LIKE '%example'; 

Dies fügt numerische Werte in die ID-Spalte basierend auf, ob die WHERE-Anweisung

SELECT * 
FROM [LcsCDR].[dbo].[SessionDetails] 
WHERE [LcsCDR].[dbo].[SessionDetails].[User1Id] = @UserIDInt; 

abgestimmt Dies ist, wo ich bin verloren. Ich versuche, alle Zeilen von [LcsCDR].[dbo].[SessionDetails] zurückzugeben, wenn die Spalte [LcsCDR].[dbo].[SessionDetails].[User1Id] alles in meiner Variablen übereinstimmt. Das Problem (denke ich) besteht darin, dass SQL nicht in die Spalte der Variablen schauen kann, um mehrere Werte zu finden. Grundsätzlich enthält die ID-Spalte in meiner Variablen @UserIDInt eine Menge numerischer Werte.

Wie führe ich die letzte SELECT-Anweisung aus und lasse SQL alle Ergebnisse zurückgeben, wenn [LcsCDR].[dbo].[SessionDetails].[User1Id] mit irgendetwas in meiner Spalte übereinstimmt?

Ich bin mit SQL Server 2014

Entschuldigt, wenn ich es schlecht erklärt. Nicht sicher, wie sonst die Frage zu stellen :)

+0

Hinweis: 'Exists' – Sami

+0

Sie haben eine Antwort, aber ich werde einen anderen Kommentar hinzufügen. Erstellen Sie KEINE temporäre Tabelle oder Tabellenvariable. Verwenden Sie einfach die gleiche Strategie wie @SqlZim, aber fragen Sie die reelle Quellentabelle direkt ab. Es gibt im Allgemeinen keinen Vorteil, eine Ergebnismenge in eine temporäre Tabelle zu speichern, wenn sie nur dazu dient, die Ergebnismenge der folgenden Abfrage zu filtern. Folgen Sie nicht blind den Designmustern. – SMor

Antwort

1

inner join mit:

select sd.* 
from [lcscdr].[dbo].[sessiondetails] sd 
    inner join @useridint i 
    on i.id = sd.user1id; 

oder exists() mit:

select sd.* 
from [lcscdr].[dbo].[sessiondetails] sd 
where exists (
    select 1 
    from @useridint i 
    where i.id = sd.user1id 
); 

oder in() mit:

select sd.* 
from [lcscdr].[dbo].[sessiondetails] sd 
where sd.user1id in (
    select id 
    from @useridint i 
); 

rextester Demo: http://rextester.com/UVCB28056

+0

Danke für die Antwort! Alle oben genannten Ergebnisse scheinen jedoch keine Ergebnisse zu liefern, obwohl ich bestätigt habe, dass Daten zu der von mir erstellten Tabellenvariablen hinzugefügt werden. Ich ersetze einfach meine letzte SELECT-Anweisung mit Ihrer, und alles scheint gut zu laufen (gibt nur keine Ergebnisse zurück). – Grayson

+2

@Grayson dann sind die IDs in Ihrer Tabelle Variable nicht in Ihrem Dataset vorhanden, wahrscheinlich wegen eines anderen einschränkenden Faktors (wie andere Elemente in der Where-Klausel) – scsimon

+0

Wenn ich eine "SELECT * FROM @UserIDInt;" Es gibt definitiv zwei Zeilen mit Zahlen in beiden Zeilen zurück. Würde dies nicht bedeuten, dass Daten in meiner Variablen vorhanden sind? EDIT: Ich habe es behoben; stellt sich heraus, dass ich ein Idiot bin und nach der falschen Information suchte. Dein Skript war absolut korrekt. Vielen Dank für die Hilfe! – Grayson

0

Verwendung:

SELECT T1.* 
FROM [lcscdr].[dbo].[sessiondetails] T1 WHERE EXISTS (
    SELECT 1 
    FROM @useridint T2 
    WHERE T2.id = T1.user1id 
); 
Verwandte Themen