1

我有一个包含 foo、bar 和 baz 列的表,其中 foo 为 bar 中的每个条目重复一次,每个 bar 中的 baz 都有一个可能的条目。举个例子:

|-----|-----|-----|
| foo | bar | baz |
|-----|-----|-----|
|  1  |  1  |alpha|
|  1  |  2  |beta |
|  1  |  3  |gamma|
|  2  |  1  |delta|
|  2  |  2  |beta |
|  2  |  3  |kappa|
|  3  |  1  |     |
|  3  |  2  |     |
|  3  |  3  |iota |
|-----|-----|-----| etc

实际上,该表具有数百万个条目。我正在寻找两个不同的 foo 条目具有匹配的 bar+baz 条目的情况(例如,它会在上面找到 foo 1 和 foo 2,因为它们都beta在它们的 bar 2 中),对于给定的 foo 范围,它不是看着整张桌子。

我不确定这是否可行,并且子查询的各种排列到目前为止还没有起作用,但是我一直在尝试进行一个列出 foo 的查询,那么接下来的列是baz where bar = x and foo = [the foo for the current row]

因此,如果查看第 2 条和第 3 条,上表将是:

|-----|-----|-----|
| foo |bar=2|bar=3|
|-----|-----|-----|
|  1  |beta |gamma|
|  2  |beta |kappa|
|  3  |     |iota |
|-----|-----|-----|

我对 sql 相对缺乏经验,所以我可能不知道执行此操作的特定语法,并且我无法通过 Google 搜索任何内容。我试过使用

select foo, (baz where bar=2) as 'bar=2', (baz where bar=3) as 'bar=3' from....

没有好的结果,这并不完全出乎意料。我考虑过将完整的选择查询作为列标题,但看不到在其中引用“foo for this line”的方法。我只是在这里追逐一个不可能的想法吗?另一种方法是使用外部应用程序来运行许多较小的查询并以这种方式存储数据,但这是我的计划,如果它不能完全在 sql server 中完成。

4

1 回答 1

1

我正在寻找两个不同的 foo 条目具有匹配的 bar+baz 条目的情况(例如,它会在上面找到 foo 1 和 foo 2,因为它们的 bar 2 中都有 beta)

这很简单。您可以通过自加入来完成此操作。

SELECT * FROM Table1 t1
INNER JOIN Table1 t2 ON t1.foo != t2.foo
WHERE
t1.bar = t2.bar 
AND t1.baz = t2.baz

看到它在这里工作。

你剩下的问题我完全不明白。好像和你上面问的没有关系。为什么要查看 bar = 2 和 bar = 3。为什么在结果中列出了 gamma、kappa 和 iota?请澄清...

于 2013-05-15T09:21:38.710 回答