使用动态子查询作为列标题

时间:2013-05-15 08:19:36

标签: sql-server sql-server-2008

我有一个包含列foo,bar和baz的表,其中foo对于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,因为它们在条2中都有beta,对于给定的范围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中完成。

1 个答案:

答案 0 :(得分:1)

  

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

这很简单。你可以通过自我加入来实现这一目标。

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

看到它正常工作here

你提出的其余问题根本不明白。这就像它与你上面提到的内容无关。为什么看bar = 2和bar = 3.为什么结果中列出了gamma,kappa和iota?请澄清......