【问题标题】:MySQL Left Outer Join Validation?MySQL左外连接验证?
【发布时间】:2014-06-17 14:20:12
【问题描述】:

我有一个表格,列出了每个位置的位置和可接受的字段:

位置               可接受的字段
-------------------------------------------------- --------|
Location_A                   地址
Location_A               电话
Location_A                 营业时间
Location_B               地址
Location_B                 电话

现在,我有一个表格,列出了我想针对第一个表格验证的值。

ID   位置    地址          电话  时间
-------------------------------------------------- --------------------|
1 位置 A 123 Some St. 9999999 8-5
2    位置 B    456 Some St.      9999998    8-4

现在,位置 A 通过了营业时间验证,但是,位置 B 列出了营业时间,但根据验证表,它不应该是。这应该是 NULL。我希望我的查询返回位置 B,8-4。这里我的 MySQL 语句显然不起作用:

SELECT Table2.Location, Table2.Hours 
FROM 
    Table1 LEFT OUTER JOIN Table2 
ON 
    Table1.Location = Table2.Location

WHERE 
    Table2.Hours is not null
    AND Table1.Acceptable_Fields != 'Hours';

【问题讨论】:

  • 让我们知道 .. 你到底需要什么输出
  • 是您的示例中列出的 table1 和 table2 中的 LOCATION 值,即Location_A 与位置 A?
  • 嗨 - 1. 这是一个错字,都是 Location_A,Location_B(在两个表中)
  • 我想要得到的输出是:Location_B 8-4

标签: mysql sql validation left-join


【解决方案1】:

这个怎么样?

SELECT Table1.Location, Table1.Acceptable_Fields
FROM Table1 RIGHT JOIN
    (
        SELECT Location, 'Address' AS col_name, Address AS col_val
        FROM Table2

        UNION ALL

        SELECT Location, "Phone" AS col_name, Phone AS col_val
        FROM Table2

        UNION ALL

        SELECT Location, "Hours" AS col_name, Hours AS col_val
        FROM Table2
    ) T3 ON Table1.Location = Table3.Location
      AND Table3.col_name = Table1.Acceptable_Fields
WHERE Table3.col_name IS NULL AND TAble3.col_val IS NOT NULL;

【讨论】:

    【解决方案2】:

    有两种方法可以实现:

    使用左连接。您将需要左加入您的控制表三次(每个控制参数(即可接受的字段)一次)并检查 NULL,如下所示:

    SELECT t2.ID,
           t2.Location,
           CASE WHEN a.Acceptable_Fields IS NOT NULL THEN t2.Address END Address,
           CASE WHEN p.Acceptable_Fields IS NOT NULL THEN t2.Phone END Phone,
           CASE WHEN h.Acceptable_Fields IS NOT NULL THEN t2.Hours END Hours 
    FROM
    Table2 t2 
    LEFT OUTER JOIN Table1 a ON
    t2.Location = a.Location AND a.Acceptable_Fields = 'Address'
    LEFT OUTER JOIN Table1 p ON
    t2.Location = p.Location AND p.Acceptable_Fields = 'Phone'
    LEFT OUTER JOIN Table1 h ON
    t2.Location = h.Location AND h.Acceptable_Fields = 'Hours'
    

    使用子查询:

    SELECT t2.ID,
           t2.Location,
           CASE WHEN EXISTS(SELECT 1 FROM Table1 WHERE Location = t2.Location AND Acceptable_Fields = 'Address') THEN t2.Address END Address,
           CASE WHEN EXISTS(SELECT 1 FROM Table1 WHERE Location = t2.Location AND Acceptable_Fields = 'Phone') THEN t2.Phone END Phone,
           CASE WHEN EXISTS(SELECT 1 FROM Table1 WHERE Location = t2.Location AND Acceptable_Fields = 'Hours') THEN t2.Hours END Hours 
    FROM
    Table2 t2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-07
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2013-09-07
      相关资源
      最近更新 更多