2

我有一个包含字段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。

更新:

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

6 回答 6

2

根据您的修订,问题似乎是“选择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'

于 2013-09-09T17:38:04.340 回答
1

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

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

这是你要找的吗?

于 2013-09-09T17:03:50.497 回答
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' 的记录;

于 2013-09-09T17:00:34.517 回答
0

您可以像这样在 sql 语句中添加另一个子句:

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

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

于 2013-09-09T17:02:14.503 回答
0

也许这就是你所追求的:

select * from mytable
where id = 'somevalue' 
or id = (select fid from mytable where id = 'somevalue')    
于 2013-09-09T17:10:19.863 回答
0

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

SELECT * FROM mytable WHERE fid IN 
(SELECT fid FROM mytable WHERE id = 'somevalue' )
AND NOT guid is null;
于 2013-09-09T17:14:41.867 回答