查询是否设置了外键

时间:2012-11-13 20:23:54

标签: mysql

好的,我有两个MySQL表:

TableA 包含以下列: idTableA idTableB_FK

TableB 包含以下列: idTableB idTableA_FK

关系如下:

  1. 从TableA到TableB的一对多关系( TableA.idTableA 是 PK,以及该关系的FK是 TableB.idTableA_FK

  2. TableA和TableB之间的一对一关系( TableB.idTableB 是PK,它以 TableA.idTableB_FK 表示。它是 一对一的关系,因为你只能在TableA中有一行来获取 外键值。

  3. 假设 TableA

    中包含以下数据
    idTableA     |    idTableB_FK
    -----------------------------
        1        |       2
        2        |       5
        3        |       6
        4        |       8
    

    以下是 TableB

    idTableB     |    idTableA_FK
    ------------------------------
        1        |       1
        2        |       1
        3        |       2
        4        |       2
        5        |       2
        6        |       3
        7        |       3
        8        |       4
    

    现在,我想要一个将显示idTableA,idTableB的查询,并将显示is_set列。设置为是/否字段(或1/0),仅当 TableA.idTableB_FK 具有该FK的相应设置值时才设置为yes。所以对于上面的例子:

    idTableA    |    idTableB    |     is_set
    ---------------------------------------------
        1       |       1        |       no
        1       |       2        |       yes
        2       |       3        |       no
        2       |       4        |       no
        2       |       5        |       yes
        3       |       6        |       yes
        3       |       7        |       no
        4       |       8        |       yes
    

    感谢。

4 个答案:

答案 0 :(得分:1)

我认为你正在寻找这样的东西:

select
  TableA.idTableA,
  TableB.idTableB,
  case when EXISTS(select null
              from TableA TableA_1
              where
                TableA_1.idTableA = TableA.idTableA
                and TableA_1.idTableB_FK = TableB.idTableB)
  then 'yes' else 'no' end as is_set
from
  TableB left join TableA
  on TableB.idTableA_FK = TableA.idTableA

答案 1 :(得分:0)

确定这是来自内存,但应该这样做。如果它是错的,我可以针对某些事情进行操作并修复它。

SELECT tb.idTableA_FK AS idTableA, tb.idTableB, tbb.idTableB IS NOT NULL AS is_set 
    FROM TableB AS tb LEFT JOIN TableA AS ta ON (tb.idTableA_FK = ta.idTableA) 
    LEFT JOIN TableB AS tbb ON (ta.idTableB_FK = tbb.idTableB)

答案 2 :(得分:0)

我相信这就是你要找的东西:

SELECT a.idTableA, b.idTableB, c.idTableB_FK IS NOT NULL is_set
FROM TableA a, TableB b LEFT JOIN TableA c ON b.idTableB=c.idTableB_FK
WHERE b.idTableA_FK=a.idTableA

答案 3 :(得分:0)

我最终这样做了:

SELECT b.idTableA_FK, b.idTableB ,

IF (
    (SELECT a.idTableB_FK 
        FROM (TableA AS a) 
        WHERE a.idTableA = b.idTableA_FK
    ) = b.idTableB, TRUE, FALSE
) AS is_set

FROM (TableB AS b)

哪个产生了正确的结果。

我要感谢所有回复的人,我正在投票fthiella因为他/她建议的解决方案对我的解决方案有影响。