SQL如何根据另一个表构造一个表中两列的查询?

时间:2014-02-25 08:31:37

标签: mysql sql sql-server

请查看我的表格结构如下:

enter image description here

Area_PrimaryTable Area_SecondaryTable 中的数据将映射到Table_TableID。我想知道当我查询AreaID = A101时如何获取表100和111的状态ID?

Select * from Area where AreaID = A101

更新 我找到了构建此类查询的方法,但不确定是否有更好的方法?

请告知如下:

Select * from Table where TableID in
(
    Select PrimaryTable from Area where AreaID = 'A101'
    union
    Select SecondaryTable from Area where AreaID = 'A101'      
)

4 个答案:

答案 0 :(得分:3)

这是JOIN特别有用的例子。看一下,因为JOIN是最终在使用SQL时经常被使用的东西。它们基本上允许您从几个相关表中获取信息,作为同一记录的一部分。

因此,您希望从两行Table获取信息,它们的关系是它们链接到Area中的同一行。我会认为你只想获得两种身份。这可以通过以下代码解决:

SELECT t1.Status, t2.Status
FROM   Area AS a
  JOIN Table AS t1 ON t1.TableID = a.PrimaryTable
  JOIN Table AS t2 ON t2.TableId = a.SecondaryTable
WHERE AreaID = 'A101'

请注意,虽然在我的书中使用SELECT *时可以进行实验,但我相信在生产代码中应该避免使用,而是明确命名要从中获取信息的列。

编辑:尽管存在明显的差异,但请注意我的代码提案与Xtoxico的行为相同。据我所知,这两个提案都是等效的。

答案 1 :(得分:0)

试试这个......

SELECT
    t1.status as StatusPrimary, t2.status as StatusSecondary 
FROM
    Area as a, 
    table as t1, 
    table as t2 
WHERE 
    a.primaryTable=t1.TableID and 
    a.secondaryTable=t2.TableId and 
    a.AreaID = A101;

你的Sample返回两行,我的代码在同一行返回信息

答案 2 :(得分:0)

我建议这个:

select t.* from table t, area a
where a.AreaID = 'A101' 
and t.TableID in (a.PrimaryTable, a.SecondaryTable)

答案 3 :(得分:0)

试试这个

SELECT a.AreaID, t.TableID, t.TableName, t.Status FROM table1 t
INNER JOIN (
    Select PrimaryTable, areaId from Area
    union
    Select SecondaryTable, areaID from Area
) a ON t.TableID = a.PrimaryTable order by a.AreaID

输出将如下所示(基于表的结构)

enter image description here

我希望这就是您所寻找的答案,如果您只需要找到A101区域,您只需在WHERE AreaID = 'A101'之后添加a ON t.TableID = a.PrimaryTable即可。

编辑:很抱歉错过了这一点,也许查询应该是这样的:

SELECT a.AreaID,
   MAX(IF(a.PrimaryTable = t.TableID, t.Status, null)) as T1,
   MAX(IF(a.SecondaryTable = t.TableID, t.status,null)) as T2
FROM Table1 t INNER JOIN Area a ON a.PrimaryTable = t.TableID OR a.SecondaryTable = t.TableID
GROUP BY AreaID