SQL语句有条件地选择相关记录

时间:2013-09-09 16:56:16

标签: sql sql-server

我的表格包含字段id(主键)和fid。我想获取id与特定值匹配的记录,以及具有相同fid值的所有相关记录。

我可以这样做:

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

但是如果fid是特定值(在我的情况下是一个空的guid值),我不想要相关记录。

有没有办法在单个SQL语句中执行此操作?我正在使用SQL Server 2008 R2。

更新

到目前为止看到答案,我想我可能没有清楚地问我的问题。 idfid永远不会平等。 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')  

6 个答案:

答案 0 :(得分:1)

根据您的修订,问题似乎是“选择id具有特定值的所有行,而id的所有其他行匹配”somevalue“,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'匹配的原始行。

答案 1 :(得分:0)

我认为这就是你要做的事情:

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

这应该返回a中的所有记录(与b中的所有记录连接,其中a.id = b.fid)然后过滤以仅显示具有a.id ='somevalue'的记录;

答案 2 :(得分:0)

你可以在你的sql语句中添加另一个子句,如下所示:

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

如果您想要多行,请按照@zigdawgydawg的建议尝试加入。

答案 3 :(得分:0)

我不确定我理解你的问题,但我会抓住它。我想您要问的是,您是否可以从一个表中选择id或fid字段等于特定值的所有记录,但如果您搜索的特定值等于空,则不需要相关字段指导价值。如果是这样,你可以这样做:

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

这是你在找什么?

答案 4 :(得分:0)

也许这就是你所追求的:

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

答案 5 :(得分:0)

几乎像zigdawgydawg的贡献,但略有不同:

SELECT * FROM mytable WHERE fid IN 
(SELECT fid FROM mytable WHERE id = 'somevalue' )
AND NOT guid is null;