2013-09-09 4 views
1

У меня есть таблица с полями id (первичный ключ) и fid. Я хочу получить запись, где id соответствует определенному значению, а также все связанные записи, которые имеют одинаковое значение fid.Оператор SQL для условного выбора связанных записей

Я могу это сделать:

SELECT * FROM mytable 
WHERE fid = (SELECT TOP 1 fid FROM mytable WHERE id = 'somevalue') 

Но я не хочу, чтобы соответствующие записи, если fid является конкретным значением (в моем случае пустого значения справ).

Есть ли способ сделать это в одном выражении SQL? Я использую SQL Server 2008 R2.

UPDATE:

Глядя на ответы до сих пор я думаю, что, возможно, не спросил мой вопрос четко. id и fid никогда не будут равными. LEFT JOIN может быть тем, что мне нужно, но я немного незнакомец SQL. То, что я надеюсь на это следующие два запроса как один оператор:

SELECT * FROM mytable WHERE id = 'somevalue' 

SELECT * FROM mytable WHERE fid = 
    (SELECT TOP 1 fid FROM mytable 
    WHERE id = 'somevalue' AND fid != '00000000-0000-0000-0000-000000000000') 
+0

не присоединился бы к тому, что вы после? –

ответ

1

На основании вашего пересмотра, проблема, как представляется, «выбрать все строки, id имеет определенное значение, а все остальные строки с id соответствуют «некоторым значениям», а fid не является нулевым.

Следующие захваты этой логики:

SELECT t.* 
FROM mytable t left outer join 
    (SELECT TOP 1 fid 
     FROM mytable 
     WHERE id = 'somevalue' AND fid <> '00000000-0000-0000-0000-000000000000' 
    ) t1 
    on t.fid = t1.fid 
WHERE id = 'somevalue' or t1.fid is not null; 

Поскольку id является первичным ключом, то t1 подзапрос возвращает 0 или 1 строк.Когда он возвращает 0 строк, вы получите только исходную строку, соответствующую 'somevalue'.

+0

Да, это работает! Ответ @BWS почти дает мне то, что тоже необходимо, если в предложении OR используется 'fid =', а также проверяется, что значение fid не равно нулю. Будет ли этот подход более/менее эффективным, чем то, что вы предлагаете? – jltrem

+0

@jltrem. , , Не смотря на планы выполнения или выполнение временных тестов, я бы подумал, что два метода будут иметь очень схожую производительность. Если у вас действительно большие таблицы и производительность - проблема, тогда лучший запрос может выглядеть по-другому. –

0

Я думаю, что это то, что вы пытаетесь сделать:

SELECT * 
FROM mytable a 
JOIN mytable b ON a.id = b.fid 
WHERE a.id = 'somevalue'; 

Это должен вернуть все записи в (присоединенной со всеми записями в b, где a.id = b.fid), затем фильтруется, чтобы отображать только записи, которые имеют a.id = 'somevalue';

0

Вы можете просто добавить еще один пункт к вашему SQL заявление, как это:

SELECT * From mutable 
WHERE fid = (SELECT TOP 1 fid FROM mytable WHERE id = 'somevalue' 
AND fid != '00000000-0000-0000-0000-000000000000') 

Если вы хотите больше, чем одну строку, попробуйте присоединиться как это было предложено @zigdawgydawg.

0

Я не уверен, что я понимаю ваш вопрос, но я возьму на него удар. Я думаю, что вы спрашиваете, можете ли вы выбрать все записи из одной таблицы, где либо id, либо поля fid равны определенному значению, но вы не хотите, чтобы соответствующие поля, если конкретное значение, которое вы ищете, равно пустому значение руководства. Если да, вот как вы это сделаете:

SELECT 
    * 
FROM 
    mytable t1 
LEFT JOIN 
    mytable t2 ON (t1.id = t2.fid) AND (t2.fid IS NOT NULL); 

Это вы, что искали?

+0

Ответ gstroup напомнил мне, что ваше поле fid может не содержать нулевого значения, и вместо этого guid может быть всем нулем; если это так, указанное соединение немного изменится: SELECT * FROM mytable t1 LEFT JOIN mytable t2 ON (t1.id = t2.fid) И (t2.fid <> '00000000-0000-0000-0000000000000000); –

0

Может быть, это то, что вы после:

select * from mytable 
where id = 'somevalue' 
or id = (select fid from mytable where id = 'somevalue')  
+0

Это дало бы мне правильный результат, если бы предложение OR использовало 'fid =', а также обеспечило, что значение fid не равно нулю. – jltrem

0

Почти как вклад zigdawgydawg, но немного отличается:

SELECT * FROM mytable WHERE fid IN 
(SELECT fid FROM mytable WHERE id = 'somevalue') 
AND NOT guid is null; 
Смежные вопросы