簡體   English   中英

MYSQL在工會中選擇與別名相同的列名

[英]MYSQL select same column name as alias in union not working

我有一個簡單的MYSQL查詢,它會合並兩個表:

SELECT * FROM (
    SELECT col1 AS col1A FROM table1
    UNION 
    SELECT col1 AS col1B FROM table2
) AS t WHERE col1A <> col1B

我在兩個表中都有一個名為col1的列,我只需要選擇該列具有不同值的行,因此我選擇它們作為別名。 當我運行此查詢時,我得到:

Unknown column 'col1B' in 'where clause'

表1數據:

col1
----
test

表2數據:

col1
----
test

該查詢應該不返回任何行,因為table1中col1中的每個值都等於table2中col1中的每個值,但是它返回table2中的col1是未知的,盡管我選擇了它作為別名

我認為您需要查找UNION的適當用法。 它將返回第一個查詢的所有結果以及第二個查詢的所有結果。 這將導致具有單個列的單個數據集(不是col1和col2),在這種情況下僅為col1。

假設您試圖獲取table1中所有不存在於table2中的記錄,則可以使用NOT EXISTS

SELECT col1 
FROM table1 t1 
WHERE NOT EXISTS (
    SELECT 1
    FROM table2 t2
    WHERE t1.col1 = t2.col1
    )

為什么OP查詢返回錯誤1054

返回的錯誤是因為從UNION結果中分配給列的名稱是從第一個SELECT獲取的。

您可以通過運行一個簡單的示例來觀察到這一點:

 SELECT 1 AS one 
  UNION
 SELECT 2 AS two 

該查詢返回的結果集將包含一個列,分配給該列的名稱將為one ,即第一個SELECT的列名稱。 這說明了為什么從查詢中得到錯誤。


一種返回不匹配的行的方法

要從table1返回col1值,該值與table2col1列中的任何值都不匹配...

一種使用反連接模式的選項...

    SELECT t1.col1
      FROM table1 t1
      LEFT
      JOIN table2 t2
        ON t2.col1 = t1.col1
     WHERE t2.col1 IS NULL

LEFT JOIN操作返回table1中的所有行,以及table2中找到的所有“匹配”行。 “技巧”是WHERE子句中的謂詞... table2中的任何“匹配”行在col1中將具有非NULL值。 因此,如果我們排除找到匹配項的所有行,則剩下的是table1中沒有匹配項的行。

如果我們想從table2中獲取在table1沒有“匹配”行的行,我們可以做同樣的事情,只是翻轉表的順序。

如果我們將這兩個集合組合在一起,但只想要“不匹配”值的“不同”列表,則可以使用UNION集合運算符:

    SELECT t1.col1
      FROM table1 t1
      LEFT
      JOIN table2 t2
        ON t2.col1 = t1.col1
     WHERE t2.col1 IS NULL
     UNION 
    SELECT s2.col1
      FROM table2 s2
      LEFT
      JOIN table1 s1
        ON s1.col1 = s2.col1
     WHERE s1.col1 IS NULL

-

找出不匹配值來自哪個表

有時,我們想知道哪個查詢返回了值; 我們可以通過在每個查詢中包含一個文字值作為鑒別符來實現。

    SELECT 'table1' AS src
         , t1.col1
      FROM table1 t1
      LEFT
      JOIN table2 t2
        ON t2.col1 = t1.col1
     WHERE t2.col1 IS NULL
     UNION 
    SELECT 'table2' AS src
         , s2.col1
      FROM table2 s2
      LEFT
      JOIN table1 s1
        ON s1.col1 = s2.col1
     WHERE s1.col1 IS NULL
    ORDER BY 2

查找不匹配行的另一種方法(通常性能較低)

返回相等結果的一種完全不同的方法將是這樣的:

SELECT q.col1
  FROM ( SELECT 't1' AS src, t1.col1 FROM table1 t1 
          UNION
         SELECT 't2' AS src, t2.col1 FROM table2 t2
       ) q
 GROUP BY q.col1
HAVING COUNT(DISTINCT q.src) < 2
ORDER BY q.col1

(內聯視圖q將被“物化”為派生表,因此這種方法對於大型集合可能會很昂貴,並且這種方法將不會利用col1上的索引來執行匹配。)反聯接方法:如果兩個表中都存在NULL,則它將忽略col1值NULL。 除此之外,結果集是等效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM