SQL - Select 列并将其重命名为其上一行的 ID

SQL - Select column and rename it as its previous row's id

我正在对两个 table 进行左外连接,A 和 B,并尝试从 B 中获取一个值并将其重命名为其上一列的 ID。所以它看起来像这样:

SELECT A.*, B.value AS B.id FROM A LEFT OUTER JOIN B ON ...

A​​S B.id 不起作用。我尝试了几个变体并搜索了 Google 和 SO 但找不到它。有办法吗?

编辑:对不起,我应该提到我试图加入的 table 总是排成一排 table。当我加入一行 table 时,我想使用该唯一行的 id 作为标识符。我计划分别加入每一行,并将它们的值放在由它们以前的 id 标识的列下。我得到了我想要的答案。看起来我想做的事情是不可能的(而且无论如何都是一个糟糕的方法),我的解决方案实际上只是采取不同的方法。

不,你不能这样做。如果您希望这样做,请使用应用程序代码(PHP,等等)。

编辑。我不知道为什么你会想要这样做,但像下面这样的东西会起作用。 (未经测试)

$rs=array(
array('a_id'=>'one','b_value'=>1),
array('a_id'=>'two','b_value'=>2),
array('a_id'=>'three','b_value'=>3)
);
foreach($rs as $key=>$arr) {
$rs[$key][$arr[$arr['a_id']]=$rs[$key]['b_value'];
unset($rs[$key]['b_value']);
}

以下方法之一应该有效:

AS `B.id`

AS id

点在别名中无效

也许试试:

SELECT A.*, B.value AS B_id from A LEFT OUTER JOIN B ON...

SQL 无法完成像您这样的声明。请记住,在 SQL 中,您必须根据集合(一组行)和集合的元素(列)来思考。您不能 return 单列,而是为每一行将该元素命名为不同的名称。如果您希望它以不同的方式命名,则必须 return 将其作为不同的列。

(而且您的查询在同一个 select 中有 2 个 FROM,这是行不通的。)

例如,如果您想为 B 的每个值使用不同的列,您可以这样做:

SELECT 
  A.*,
  case when B.id = 1 then B.value end as B1,
  case when B.id = 2 then B.value end as B2,
  (etc...)
FROM A LEFT OUTER JOIN B ON ...