web-dev-qa-db-ja.com

使用されるSELECTステートメントの列数が異なります

たとえば、各テーブルの行数がわからないので、次のようにしようとします。

SELECT * FROM members 
UNION 
SELECT * FROM inventory

SELECTを追加せずにこのエラーを削除するには、*の代わりに2番目のNULLに何を入れることができますか?

12
good_evening

*ではなく列名を明示的に入力し、各選択で同じ列の列数とデータ型が一致することを確認してください。

更新:

テーブル名に基づいて、これらのテーブルをUNIONしたいとは思わない。関連するデータが含まれていないようです。スキーマを投稿し、達成しようとしていることを説明すると、より良い支援を提供できる可能性があります。

9
RedFilter

あなたができる

SELECT *
from members
UNION
SELECT inventory.*, 'dummy1' AS membersCol1, 'dummy2' AS membersCol2
from inventory;

どこ membersCol1membersCol12などは、membersにないinventoryの列の名前です。そうすれば、ユニオンの両方のクエリの列が同じになります(inventoryのすべての列がmembersの列と同じであると仮定すると、これは私には非常に奇妙に思えます...しかしねえ、それはあなたですスキーマ)。

[〜#〜] update [〜#〜]

HLGEMが指摘したように、これはonlyは、inventorymembersと同じ名前の列がある場合にのみ機能します。同じ順序。すべての列に明示的に名前を付けるのが最善の方法ですが、名前がわからないため、正確に名前を付けることはできません。私がそうした場合、それは次のように見えるかもしれません:

SELECT id, name, member_role, member_type
from members
UNION
SELECT id, name, '(dummy for union)' AS member_role, '(dummy for union)' AS member_type
from inventory;

ダミー値にNULLを使用するのは好きではありません。レコードがユニオンのどの部分から来たのかが常に明確であるとは限らないためです。「ダミー」を使用すると、レコードがそのレコードを持たないユニオンの部分からのものであることが明確になります。 (これは問題にならない場合もありますが)。これらの2つのテーブルを結合するというアイデア自体は、同じ名前の列が1つまたは2つ以上あるとは非常に疑わしいため、私には非常に奇妙に思えますが、シナリオで想像できるような方法で質問をしました。理にかなっています。

代わりに参加したくないですか? UNIONがテーブル名を指定して必要なものを提供する可能性はほとんどありません。

2
HLGEM

MySQL UNION ALL演算子内の各SELECTステートメントは、結果セットに同じ数のフィールドがあり、データ型が類似している必要があります。訪問 https://www.techonthenet.com/mysql/union_all.php

0
user9862225

各テーブルの行数がわかりません

これがあなたが望むものではないと確信していますか?

SELECT 'members' AS TableName, Count(*) AS Cnt FROM members 
UNION ALL
SELECT 'inventory', Count(*) FROM inventory
0
ErikE